这是为了功课。我的程序运行正常,但是无法摆脱内存泄漏。
我有一个Class对象。
我有一个类objectPtr,它有一个指向对象类的指针。
我有...
typedef set<objectPtr> ObjectSet;
我的对象存储如下:
map<string, ObjectSet*> myMap;
当我尝试遍历数据结构时,删除对象(这就是我想做的...),导致代码崩溃。
for(map<string, ObjectSet*>::const_iterator it = myMap.begin(); it != myMap.end(); ++it) {
for(ObjectSet::const_iterator e = it->second->begin(); e != it->second->end(); ++e)
delete e->getPtr();
}
什么是正确的方法?
最佳答案
您可以在objectPtr
的设计中使用RAII的基本原理。一般概念是为类objectPtr
定义一个析构函数,该析构函数在存储的指向object
的指针上调用delete。然后,您只需要在地图上绕一圈即可删除指向ObjectSet
的原始指针。因为objectPtr
作为实例存储(而不是指向实例的指针),所以当销毁ObjectSet
时,将自动调用其析构函数。
另外,由于要在for循环中调用delete,因此您可能需要非常量正向迭代器。
这是一个例子:
class object
{
// ... interface details ...
};
class objectPtr
{
public:
objectPtr(object* p) :
ptr(p)
{}
~objectPtr()
{
if (ptr)
delete ptr;
}
public:
// ... interface details ...
private:
object* ptr;
};
typedef set<objectPtr> ObjectSet;
map< string, ObjectSet* > myMap;
for(map< string, ObjectSet* >::iterator it = myMap.begin(); it != myMap.end(); ++it)
{
ObjectSet* setPtr = it->second;
if (setPtr)
delete setPtr; // ObjectSet will call 'delete' for each instance of
// objectPtr, which through RAII, will automatically
// delete the referenced instance of object
}