这是为了功课。我的程序运行正常,但是无法摆脱内存泄漏。

我有一个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
}

08-19 01:57