2012-12-19 75 views
0

似乎它的簡單問題,但我懷疑。請運營商delete銷燬全部Object的元素當我撥打delete list非空列表用運營商創建new?當然會,但我需要確認。正如你所看到的Object有構造函數,但沒有分配器。C++操作符新增並刪除內存泄漏與容器

代碼:

std::list<Object>* ptr_listObjects = new std::list<Object>(); 
OtherObject* ptr_null = NULL; 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
delete ptr_listObjects; // no any possible memory leaks? (Object does not use `new` operator) 


class Object 
{ 
public: 
    Object(OtherObject* ptr_other, char xxx): 
    ptr_OtherObject(ptr_other), 
    charflag(xxx) 
    {} 


    OtherObject* ptr_OtherObject; 
    char charflag; 
}; 
+0

我很確定它會。但處理這種情況的最簡單方法是創建一個析構函數,用於輸出消息並查看是否有輸出。 – StoryTeller

+0

我假設你的意圖是*不*在本示例中練習類[Object]的[Rule of Three](http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming))。有時你不需要(對象不「擁有」ptr_OtherObject對象),但很難說這是否是其中的一種。希望你會知道(這是畢竟你的代碼)。 – WhozCraig

+0

請檢查一下http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/smart_ptr.htm – czchlong

回答

6

std::list析構函數運行,因此將它的元素的析構函數。那就是說,你爲什麼要動態地分配一個容器來開始?您正在讓容器無法爲您管理內存。讓它做好工作;分配具有自動存儲持續時間的列表。

順便說一句,Object確實有有析構函數,編譯器會爲您生成一個空的函數。雖然沒有什麼要清理的,所以它什麼都不做。另外,從類設計中可以清楚地看出,Object的實例不擁有它的構造函數所需的指針,因此除非明顯改變設計,否則請務必不要釋放它。

+0

+1或者至少在智能指針中包裝該列表。 – WhozCraig

+0

謝謝。我動態地分配它,因爲我1)在許多函數中使用它,並通過函數將指針傳遞給它2)然後我將它存儲大約30分鐘,並且只有我可以用操作符'delete'來銷燬它。.. – abrahab

+0

@abrahab:There是其他方式。我可以誠實地說,我從未動態分配過這樣的容器(並且我每天都編寫C++代碼,當然,這並不意味着我遇到過所有情況)。您可以通過引用將容器傳遞給函數。如果這不起作用,那麼你應該把它作爲'unique_ptr >'來維護。智能指針會爲您解除分配。我可以想到做你正在做的事情沒有什麼好的理由。 –