2010-07-01 93 views
9

我有一張地圖,其中我的值是動態分配的。當我對元素進行擦除()時,這是否釋放內存或者只是從地圖中移除元素。C++ map erase()

我實際上需要保持內存不變。我只需要從地圖中移除元素,因爲這個動態分配的結構在代碼的其他地方使用。

+3

你的意思是什麼_exactly_? 'std :: map'會動態分配自己的值併爲你管理它們的生命週期。 'erase'將刪除並銷燬一個元素。如果映射中的值實際上是指向外部分配對象的指針,那麼被銷燬的僅僅是指針,而不是它可能指向的任何東西。 – 2010-07-01 18:10:30

+0

是的。我的地圖中的值是外部分配的對象,即指向某物的指針。謝謝你的解釋。 – 2010-07-01 22:48:42

+0

你會接受答案嗎? – 2010-07-08 13:51:01

回答

11

不,它不釋放內存,如果它是裸指針。您需要確保內存正確釋放。

  • 如果您使用裸指針,請確保在需要時清理內存。

  • 如果您使用的是智能指針,並且地圖保存了對象的最後一個引用,那麼當地圖擦除時,內存將被智能指針的析構函數清除。

STL容器不會管理你的內存,所以確保你這樣做。將物品放入容器時,我幾乎總是使用助推器的shared_ptr

+1

我認爲最好是明確定義盲目地將'shared_ptr'扔到任何地方並冒週期風險的所有權(只要適用)。當容器擁有內存時,Imho Boost指針容器更適合。 – 2010-07-02 06:05:06

+0

@Matthieu,不建議盲目做任何事情。當然,使用'shared_ptr'並不意味着你正在盲目使用它,正如你所假設的那樣。 – 2010-07-02 12:17:39

+0

對於「我有要傳遞的指針」的答案通常是「使用shared_ptr」。這就是你的答案。如果仔細觀察這個問題,你會注意到OP **不希望在指針從地圖上擦除時釋放內存....所以他沒有理由使用'shared_ptr '。 – 2010-07-02 13:36:42

9

當您從map<something,something_else*>中選擇erase時,它只會從地圖中刪除元素。它不會調用擦除元素上的delete運算符(或任何其他函數)來釋放內存。

4

標準容器不會銷燬在您擦除元素時放置在其中的動態分配的對象。基本上,如果你創建它,那麼你需要摧毀它。

5

不,地圖中指針引用的對象不會被刪除。

C++標準庫中的容器有語義。他們會摧毀你投入他們的物體。當這些對象是指針時,這些指針將被銷燬,但不是它們所指向的對象。

使用boost_shared_ptr<>std::map< key, boost_shared_ptr<value> >)或std::tr1::shared_ptr<>std::shared_ptr<>,如果您的環境支持它,以擺脫大多數與內存相關的問題。

+0

如果他有另一個指向他們使用的地方的指針,他不會*泄漏這些對象。 – 2010-07-01 18:35:19

+0

@Ken:好的,我沒有把問題看得很清楚。感謝您指出,我解決了這個問題。 – sbi 2010-07-01 19:31:51