簡體   English   中英

我是否需要刪除靜態std :: map?

[英]Do I need to delete an static std::map?

在某些類中,我有一個帶有指針的靜態std :: map。 我的問題是,如果我需要在程序結束時刪除或自動釋放此內存。 我關心的是當刪除std :: map時,是否通過析構函數正確刪除了存儲在內部的指針。

謝謝。

如果映射包含使用new (或new []malloc )分配的指針,則每個指針都需要相應的刪除 (或刪除[]空閑 )。

地圖的析構函數不知道如何處理光頭指針。 考慮使用具有適當移動語義的智能指針 ,如boost智能指針,或者如果你有一個非常新的編譯器, C ++ 0x智能指針之一 但是, 不要在STL容器內使用當前標准的std :: auto_ptr 請參閱此主題了解原因

編輯:

正如Billy ONeal指出的那樣, boost :: ptr_map也是為此目的而設計的。

如果我正確了解情況,則不會刪除地圖本身。 但您可能需要刪除地圖指向的對象。 在地圖中使用諸如Boost shared_ptr之類的智能指針而不是本機指針可能是一個非常好的主意。 然后自動清理對象。

編輯:使用Boost ptr_map可能是一個更好的主意。

在釋放整個進程內存的意義上,內存被“自動釋放”,但是不會調用指向的對象的析構函數。 如果您使用RAII,這可能會導致資源泄漏。

std::map從不在其成員上調用delete 假設您正在使用相對較新的操作系統,操作系統將回收進程終止時成員占用的內存,但析構函數將無法運行。

如果你有一個指針映射,那么答案是'no',你的析構函數不會被調用,但是'yes',內存將在流程執行結束時被釋放。 當進程退出時(即使崩潰),進程分配的所有內存始終由操作系統釋放,但可能不會調用析構函數。

內存“泄漏”是指在一段時間內無意中未刪除內存,並隨着進程的繼續而減少內存。 如果它是一種運行很長一段時間的進程,例如很少重啟的服務器,這可能是一個主要問題。

內存泄漏檢測器將接收任何已分配但未被編程調用刪除的內存,因此valgrind等會將此報告為泄漏。

使用像valgrind這樣的程序檢查你的代碼也是如此,因此“越過障礙”越少,就越容易發現真正的泄漏。 因此,當您使用new(或malloc或new [])分配指針時,我的建議不是讓系統為您清理內存或單例等。

你可以通過“清理”程序來完成這項工作。 只需在地圖范圍內有一個具有刪除器的對象(因為它將在退出時刪除),它將清除地圖中的指針。 由於您需要首先刪除對象,因此應在地圖之后聲明它。

就像存儲指針的任何存儲類一樣:你負責釋放他們指向的內存。 存儲類僅負責清理自己的資源。 在過程終止時依靠OS回收內存是一種不好的做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM