STL中的一些问题和c ++中的列表使用

时间:2011-05-13 08:33:39

标签: c++ stl memory-leaks

您好我想问一下: 我有地图和清单

问题:

以下是对析构函数的实现是否正确:

   for (map<string,SymbolTableNode*>::iterator i = symbolTable.begin();
                         i != symbolTable.end(); ++i)
   {
       delete i;
   }
   symbolTable.clear();

还是我想念一些记忆?

关于清单:

   list<MyClass2*> mylist;
   mylist.push_front(new MyClass());
   mylist.pop_front();

弹出调用删除吗?或者我在这种情况下有内存泄漏?如果存在泄漏问题,那么我该怎么做才能避免呢?

谢谢。

5 个答案:

答案 0 :(得分:4)

pop_front不会调用删除。在弹出指针之前,你必须自己删除它。:

list<MyClass2*> mylist;
mylist.push_front(new MyClass());
delete mylist.front();
mylist.pop_front();

析构函数应该是:

delete i->second;

答案 1 :(得分:3)

你有泄漏。请参阅智能指针(http://en.wikipedia.org/wiki/Smart_pointer)

更明确地说:

list<boost::shared_ptr<MyClass2> > mylist;


mylist.pop(); // now it will invoke delete

答案 2 :(得分:1)

你真的需要一个指针列表吗?你不能有一个简单的清单吗?

list<MyClass> mylist;
mylist.push_front(MyClass());

它将为您节省内存管理的痛苦。

如果需要指针,请使用boost:http://www.boost.org/doc/libs/1_46_1/libs/ptr_container/doc/ptr_container.html

中的智能指针或指针容器

答案 3 :(得分:0)

delete i;

错误。

这应该是这样的:

delete i->second; 

因为i指向一对。

答案 4 :(得分:-1)

纳瓦兹 - 你错了。

地图的迭代器元素是一对,所以正确的删除调用是:

delete (*i).second;

P.S。 好的 - 现在我看到你修好了这个:)。