我是一个爱好 c++ 程序员,这是我的第一篇文章。
首先,让我告诉你,我正在开发跨平台的 ansi C++。
我刚刚做了很多工作来弄清楚内存管理,我终于掌握了使用 std::vector 并在删除期间手动管理指针的窍门。
另外,我一直在使用 boost::smart_ptr ,它终于点击了。
但是我刚刚遇到了一些代码,其中我们将有一个类 Foo,它的构造函数向 FooManager (单例)注册自己
Foo::Foo()
{
FooManager::Instance()->register(this);
}
在 FooManager 的销毁过程中,它遍历 std::vector 并对每个元素应用擦除和删除,有效地清理了 Foo 的内存。
FooManager::~FooManager()
{
// iterate over the container of Foo pointers
// erase the pointer from container and delete the pointer
}
我很困惑,因为我们不是 a) 在创建过程中使用 boost::smart_ptr 来包装指针,并且 b) 我们在构造函数和析构函数中使用内存管理技巧。
这是一个可行的解决方案,还是使用单例的析构函数来清理它管理的对象是否存在可怕的危险?
从我自己的测试中,我发现了一个根本性的缺陷。Foo 不应再在堆栈上分配。当对象超出范围时,它会取消引用自身。当调用 FooManager 的析构函数时,它会尝试再次删除它。这会产生一个断言错误:
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
这是唯一的缺点吗?我应该在 Foo 构造函数之外向管理器移动注册吗?我是否应该有一个 FooManager 的单独功能来清除我在程序生命周期结束时手动调用的内存?您对此事有何看法?