2015-05-19 27 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