【问题标题】:How to correctly deallocate a list of pointer to pair?如何正确释放要配对的指针列表?
【发布时间】:2018-05-28 12:22:14
【问题描述】:

在我的 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;

这是一个正确的方法吗?

【问题讨论】:

  • 我的第一个建议是不要一开始就使用这么多指针。没有指针,没有newnew[],也不需要deletedelete[]。除非您有非常具体的要求,否则请使用 std::vector 而不是 std:list
  • 如果你习惯了Java,你需要改掉输入new来创建对象的习惯。常见的 C++ 方法是使用 std::vector&lt;std::pair&lt;MyClass, MyClass&gt;&gt; myList; 而不必担心。
  • 如果列表拥有对象,它应该包含对象而不是指针,如果它不拥有,那么它不应该打扰删除它们

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


【解决方案1】:

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

但是,我建议您不要动态创建 list,因为它已经动态存储了其内部数据。然后,使用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;

完全忘记指针。

【讨论】:

  • 拥有包含指针的节点而不只是节点有什么好处? std::list 保证已经有稳定的元素
  • @Galik 是的,你是对的,我可以使用 std::list<:pair myclass>> myList; ,我只用它来做一些指针测试。但我解除分配的“模式”在逻辑上是否正确?
  • @Antonio1996 但我要强调的是,将原始指针与newdelete 一起使用不再被认为是好的做法。
【解决方案2】:

您很可能还需要删除每对的第一个 ( "Stato" ) 元素,使用类似

的调用
delete (*it).first;

【讨论】:

    【解决方案3】:

    这个数据结构有点噩梦:

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

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

    简化:

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

    【讨论】:

    • 是的,你是对的,我只是用它来做一些指针测试。但我解除分配的“模式”在逻辑上是否正确?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多