0

这是为了家庭作业。我的程序运行正常,但我无法摆脱内存泄漏。

我有一个类对象。

我有一个类 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();
}

这样做的正确方法是什么?

4

1 回答 1

1

您可以在objectPtr. 一般概念是为类定义一个析构函数,该析构函数objectPtr在存储的指针上调用 delete object。然后,您只需要围绕地图进行一个循环即可删除指向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
}
于 2013-03-25T05:02:47.223 回答