2013-11-27 64 views
2

我遇到了std :: list的問題。std :: list.remove調用析構函數但不刪除它

std::list<Component*> mComponents; 
//add some pointer in it 
Component * comp = getComponent("positionComponent"); 
mComponents.remove(comp); 

由於某種原因,它調用comp指針的析構函數,但不刪除它;通過析構函數刪除的項目被刪除,而列表中的所有其他項目保持不變。什麼會導致這種行爲?

+0

指針的析構函數什麼也不做...... – aschepler

+0

刪除不刪除列表中的項目: http://stackoverflow.com/questions/799314/difference-between-erase-and-remove – VladimirM

+0

不知道你是什麼意思當你說它調用析構函數但不會刪除它......它調用'Component ::〜Component()',但不釋放內存?這段代碼不應該調用'Component ::〜Component()',因爲它不會銷燬一個'Component',只是一個'Component *'。 – filipe

回答

6

調用list.remove確實調用了包含類型的析構函數,但在你的情況下,正在調用Component *的析構函數,這是一個無操作。在刪除它之前,您必須手動找到該項目並將其輸入delete

auto item = std::find(mComponents.begin(), mComponents.end(), comp); 
if(item != mComponents.end()) { 
    delete *item; 
    mComponents.remove(item); 
} 

這就是爲什麼在標準容器中粘貼原始指針不可取的原因。您應該改用std::list<std::unique_ptr<Component>>unique_ptr將爲您管理的對象調用delete

或者,如果您使用的是Pre-C++ 11編譯器,則boost::ptr_list是另一種選擇。

+0

即使我提出的問題並沒有任何意義(爲什麼指針會調用析構函數)。我猜測這是一個內存泄漏,給人意想不到的行爲。我一直在考慮使用智能指針。在添加這個驚人的功能之前,我只需要使代碼工作。 – Gasim

+1

@Gasim:如果您每次從列表中刪除該項目,都清楚該列表*擁有該項目。爲什麼不只是'std :: list '?爲什麼要存儲指針? –

+0

你的意思是'刪除*項目;'? – ildjarn

相關問題