删除列表中创建的对象

Delete created Objects inside List

本文关键字:对象 创建 删除列 列表 删除      更新时间:2023-10-16

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

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

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

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

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

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

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

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