2012-10-21 85 views
1

可能重複:
Does std::list::remove method call destructor of each removed element?容器出範圍和內存管理

假設我有這樣的:

void f(...) 
{ 
    . 
    . 
    std::list<X*> xList; 
    . 
    // Then i fill the list 
    std::list<X*>::iterator iter; 
    for (iter = xList.begin(); iter != xList.end(); ++iter) 
    { 
     *iter = new X(); 
    } 

} 

當的Xlist超出範圍,我知道,容器應該調用列表中包含的對象的析構函數?首先,這是真的嗎?

如果是這樣,那麼由於列表中包含指向類X的指針,當xList超出範圍時不應該調用析構函數ofX?從而釋放X所擁有的任何內存?

+0

這與您的即時問題無關,但這不是填充操作。這是對列表元素的分配。如果這個列表從創建時開始一直是空的,那麼它也是一個空操作。 –

回答

3

是和否。 每個元素的析構函數都會被調用。 但是這不會導致你想要的效果。這些元素的類型爲,因此將調用的析構函數(對指針類型不做任何處理),而不是您需要的X的析構函數。你需要明確地刪除你的元素。一般來說,如果您的代碼中有new,則應該有相應的delete

+0

非常感謝!好吧,一個愚蠢的問題,X *的析構函數可能會被重載? – Kam

+0

@Kam不,你也不想這麼做。 – delnan

+0

@Kam,智能指針將確保你的對象的析構函數在智能指針的時候被調用。 – chris

1

在C++標準庫設計中,容器是包含元素的唯一所有者,所以當容器被銷燬時,所有元素都被銷燬。

但是請注意,在C++中「銷燬」裸指針是無操作,因此指向的元素不會被刪除(裸指針可指向靜態分配的數據或指向其他容器擁有的數據)。你可以做的是創建一個元素的std::list(而不是指向元素的指針)或者(如果你需要一個指針,例如,由於多態性),你可以使用可以小心的智能指針如果你喜歡的話,可以選擇尖銳的元素。