如何从嵌套的STL容器中删除

时间:2013-03-20 14:11:15

标签: c++ memory memory-leaks

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

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

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

1 个答案:

答案 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
}