【问题标题】:Delete created Objects inside List删除列表中创建的对象
【发布时间】:2015-05-19 06:59:09
【问题描述】:

我正在循环中创建一些对象并将其添加到列表中:

list<MyObject> myList;    
MyObject* ob = new MyObject();
ob.setAttribute("whatever");
myList.push_back(*ob);

循环结束后,我多次使用该列表。 我现在已经启动了泄漏检测器并看到,我必须删除所有 MyObject 对象。

我如何正确删除它们(在析构函数中?)。我应该使用迭代器吗?但是我如何获得真正的对象——而不是迭代器指针?

非常感谢。

【问题讨论】:

  • 请注意,您的列表包含原始对象,而不是指向它们的指针。
  • 这不会编译 - 您正在尝试将指针推送到对象列表中。除非您有充分的理由与 new 开玩笑,否则只需使用 push_back(Object()),不要担心内存泄漏。
  • 对不起 - 我在问题中编写了示例代码,忘记添加一些细节。我已经修改过了。
  • @丹尼。您的泄漏实际上在这里:myList.push_back(*ob); 只要ob 超出范围,在堆上创建的对象就会泄漏。回击获取了MyObject 的副本。
  • 这很清楚。我知道泄漏是在哪里产生的。当我只有可用列表时,是否无法删除析构函数中的对象?

标签: c++ string list


【解决方案1】:

这里绝对没有理由动态分配,因为列表按值存储对象。您所做的只是复制和丢弃一个动态对象;它会立即泄露,因为您没有在任何地方保留指向它的指针。只需直接推送对象,必要时复制临时或自动变量:

list<MyObject> myList;    
MyObject ob;
ob.setAttribute("whatever");
myList.push_back(ob);

如果您确实需要存储指针,也许是为了多态性,那么您应该使用智能指针来避免泄漏:

list<std::unique_ptr<MyBase>> myList;
std::unique_ptr<MyObject> ob(new MyObject);
ob->setAttribute("whatever");
myList.push_back(ob);

如果您出于某种原因真的想要处理原始指针,那么是的,您必须自己删除它们。你真的不应该这样做。

【讨论】:

    【解决方案2】:

    您不需要删除它们,它们会在push_back() 添加到列表时被复制。但是,您需要在使用后删除ob。如:

    list<MyObject> myList;    
    MyObject* ob = new MyObject();
    ob.setAttribute("whatever");
    myList.push_back(*ob);
    delete ob;
    

    这里基本上不需要使用指针,只需在栈中声明ob即可,避免手动管理内存:

    list<MyObject> myList;    
    MyObject ob;
    ob.setAttribute("whatever");
    myList.push_back(ob);
    

    并且,根据你程序的要求,你可以使用某种智能点来避免这种手动内存管理,例如:

    list<std::shared_ptr<MyObject>> myList;    
    myList.push_back(new MyObject);
    ...
    // don't need to delete them manually
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2017-02-10
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2020-04-17
      相关资源
      最近更新 更多