我在循环中创建一些对象并将其添加到listwith:
list<MyObject> myList;
MyObject* ob = new MyObject();
ob.setAttribute("whatever");
myList.push_back(*ob);
循环结束后,我多次使用该列表。
我现在开始使用泄漏探测器并看到,我已删除所有MyObject
个对象。
我如何正确删除它们(在析构函数中?)。我应该使用迭代器吗?但是我如何获得真实对象 - 而不是迭代器指针?
非常感谢。
答案 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