2011-05-20 72 views
2

我有一張動態分配的對象的地圖,想知道刪除它們的最佳方式是什麼?從地圖中刪除動態分配的內存

我在想也許是interator?就像:

studentlist::const_iterator deletemem = studentmap.begin(); 
for(studentlist::const_iterator deletemem=studentmap.begin(); deletemem!=studentmap.end();++deletemem) 
{ 
    Record *z=deletemem->second // Record is the type of object stored in the map student map 
    delete z; 
} 

但我不知道,任何幫助將不勝感激!

回答

4

你的代碼看起來不錯。但是,手動刪除可能不是異常安全的。您可能會考慮使用share_ptr(或者the one from Boost,或者,如果您使用C++ 0x,則爲標準實現)或使用boost::ptr_map

編輯:要刪除地圖中的實際數據,請在刪除所有內容後調用studentmap.clear()。這將刪除地圖中的所有元素。

編輯2:解決方案的問題出現時,例如由於例外,您的清理代碼不會被調用。在這種情況下,你會泄漏內存。爲了克服這個問題,你可以使用RAII -idiom。上面描述了兩種可能的方法。

+0

上面使用的代碼不是說只有我創建的指針被刪除,而不是保存在地圖中的實際數據?謝謝您的回答! – CXR 2011-05-20 12:59:48

+0

@CXR:是的。我更新我的答案。 – 2011-05-20 13:01:51

+0

等等,對不起,我有點困惑,所以我寫的代碼並不刪除地圖的內容?我已經在使用studentmap.clear(),只是想知道元素是否是動態分配的,是否需要單獨刪除它們,如果上面的代碼工作正常? – CXR 2011-05-20 13:05:11

1

更好的解決方案是將動態分配的內存封裝在另一個堆棧分配的對象內。這可能是您自己的發明之一,也可以使用新C++標準中的shared_ptr類或boost。

0

您的代碼應該可以正常工作,但您最終應清除studentmap

當然,你也必須使任何其他應該保留你要釋放的指針副本的對象無效,否則你的應用程序可能會崩潰。