2014-03-27 133 views
0

如何在C++中枚舉所有已分配的對象(由new運算符分配)(不僅是那些具有自己的內存映射的對象,還包括堆中的那些對象?)?枚舉分配的對象

我需要這個來查找內存泄漏。

平臺:Linux,GCC,I386,AMD_K64(最好:獨立平臺)

可能沒有正式的方式,但也有可能是一個精幹的解決方法。 例如,是否有一些內部變量可以訪問?也許一個指向用於管理堆的列表的指針?

+1

[massif](http://valgrind.org/info/tools.html#massif) – jsantander

+0

你要求的只是檢測器的怪物卡車上的輪胎。爲什麼不使用衆多現有產品之一? – delnan

+0

因爲我想構建摩托車:)它應該爲用戶提供查找視圖,而不會在程序中加入太多的權重,以便在程序失敗時發現他自己正在發生的事情。但是,現在,我正在嘗試地塊,其中我不知道它劫持了malloc函數(並且我不知道是否有任何新的調用malloc) – Ohnemichel

回答

0

你總是可以使用valgrind來檢查內存泄漏。無論是與你的包管理器安裝它,還是下載並編譯:http://valgrind.org/

如果您編譯在調試模式下您的應用程序可以找出下來到已分配的未釋放/刪除資源文件/線。

+0

等待! Quote:地塊運行程序比正常慢20倍。我無法定期將其添加到我的程序中。 – Ohnemichel

0

您可以使用的valgrind它不正是你想要的(與它自己的實現替代的malloc)和計數分配/釋放

+0

從理論上講,它會造成太多的開銷。順便說一句。沒有使用valgrind的反射使用massif.h。漂亮的工具,但沒有辦法在我的程序中添加功能,例如「讓指針指向第n個實例...」 – Ohnemichel

0

有可能兩種形式的記憶喪失

  1. 內存,這是已分配,但不再從任何地方引用......因此無法將其刪除。這是一個正確的泄漏。在Linux中,主要的工具是valgrind。 Valgrind是一個多工具框架。您將要使用的工具是memcheck ....這是一個動態分析工具,將報告有關泄漏和其他內存問題。這比列舉分配的內存更進一步,但它也需要檢查它是否仍被引用。
  2. 被分配的內存,它仍然被引用,但不知怎的,你已經忘記了它(例如無限增長的矢量,因爲沒有人永遠不會刪除它)。這是你需要一個工具來告訴你分配的所有內存的組成。 valgrind可以幫助你。這次的工具叫做massif

我敢肯定還有更多的工具。這些很受歡迎。

在Solaris中,我建議libumem用於Sun Studio中的泄漏跟蹤和分析器,以進行分析和內存分析。

+0

我不能使用任何這種功能。我無法從觀察過程中找到一種方法(訪問內部地塊錄音)。Valgrind增加了一個巨大的新依賴項,擾亂了程序的身份,甚至可能引入內存泄漏。 – Ohnemichel