删除List中创建的对象

时间:2015-05-19 06:59:09

标签: c++ string list

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

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

循环结束后,我多次使用该列表。 我现在开始使用泄漏探测器并看到,我已删除所有MyObject个对象。

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

非常感谢。

2 个答案:

答案 0 :(得分:4)

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

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);

如果你真的想因为某些原因而耍弄原始指针,那么是的,你必须自己删除它们。你真的不应该这样做。

答案 1 :(得分:1)

您不需要删除它们,它们会在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