2015-05-19 26 views
0

我创建一个循环内的一些对象,并把它添加到listwith:删除创建的对象的内部名单

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

循环结束后,我使用了列表几次。 我已经开始了一个泄漏检测器,看到了,我必须删除所有的MyObject对象。

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

非常感谢。

+1

请注意,您的列表包含原始对象,而不是指向它们的指针。 – Rerito

+4

这不会编译 - 你试图将一个指针推入对象列表。除非你有一个很好的理由来使用'new',否则只要执行'push_back(Object())'并且不用担心内存泄漏。 –

+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

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