这是作业。我的程序运行正常,但我无法摆脱内存泄漏。
我有一个Class对象。
我有一个Class objectPtr,它有一个指向对象Class的指针。
我有......
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();
}
这样做的正确方法是什么?
答案 0 :(得分:1)
您可以在objectPtr
的设计中使用基本的RAII原则。一般概念是为类objectPtr
定义一个析构函数,它在存储的指向object
的指针上调用delete。然后你只需要在地图周围有一个循环来删除指向ObjectSet
的原始指针。因为objectPtr
存储为实例(而不是指向实例的指针),所以当ObjectSet
被销毁时,它会自动调用它的析构函数。
另外,因为你在for循环中调用了delete,所以你可能需要非const前向迭代器。
以下是一个例子:
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
}