如何正确释放指向对的列表?

时间:2018-05-28 12:22:14

标签: c++ c++11 memory-management memory-leaks

在我的c ++程序中,我有这个变量:

std::list<std::pair<MyClass,MyClass>*>* myList = 
    new std::list<std::pair<MyClass,MyClass> * >() 

如何正确删除此结构的所有信息以避免内存泄漏?我想在这种模式下做:

list<pair<MyClass,MyClass>*>::iterator it;
for(it = myList->begin(); it != myList->end(); it++){
    delete *it;
}
delete myList;

这是一种正确的方法吗?

3 个答案:

答案 0 :(得分:1)

您当前的代码是正确的,它会删除所有内容。

但是,我建议您不要动态创建列表,因为它已经动态存储了内部数据。然后,使用std::unique_ptr自动删除。

而不是:

std::list<std::pair<MyClass,MyClass> * > * myList=new std::list<std::pair<MyClass,MyClass> * >();

此:

std::list<std::unique_ptr<std::pair<MyClass, MyClass>>> myList;

现在,当您从列表中删除元素时,std::unique_ptr会为您删除它。

但是在您的具体示例中 实际上没有必要将您的元素存储为开头的指针,因为这是拥有容器(负责删除其内容)

所以你可以这样做:

std::list<std::pair<MyClass, MyClass>> myList;

完全忘记指针。

答案 1 :(得分:0)

很可能你还需要删除每对中的第一个(&#34; Stato&#34;)元素,使用类似

的调用
delete (*it).first;

答案 2 :(得分:0)

这种数据结构有点像噩梦:

std::list<std::pair<MyClass,MyClass> * > *

这是一个指向列表的指针(指向头尾节点的指针),其中列表中的节点是指针。因此,要访问第一个元素,您必须取消引用三个指针。这对速度和内存使用都不利。

简化:

std::list<std::pair<MyClass,MyClass> >