2012-07-17 243 views
1

我得到了問題,我的應用程序有一個無限的增長內存泄漏,這是沒有檢測到。我做的很簡單,就是創建一個對象,在其上運行一個方法,然後刪除該對象。每次我這樣做時,TaskManager中的內存使用量都會增長大約50-100MB。這在一些運行後耗盡了我的整個記憶。我通過多線程來做到這一點,但是沒有靜態變量,所以我的線程中的不同對象之間沒有衝突。它們只使用其他對象的靜態方法,不會修改任何其他內存,而不會修改參數中的內存 - 所以它是線程安全的。 我試圖找出原因:內存泄漏沒有檢測到CRT內存泄漏檢測

  • 使用crtdbg.h(CRT-Memeory氣密性檢測),但也有隻因爲我的應用程序的啓動而存在泄漏 - 他們會在關機時被刪除他們並不那麼大。
  • 我一直在尋找,我繼承的所有對象的虛析構函數,但它們都可以

還有什麼我可以嘗試找出我的應用程序泄漏?我在HEAP中找不到任何泄漏,除了可能導致STACK泄漏的析構函數問題之外,我不知道任何其他原因(通過這個,我的意思是一個對象不會銷燬一個本地的std :: string對象已經在堆中分配空間)。我不知道「STACK-Leaks」是否還有其他原因,但我知道在我的方法中,內存增長最多的部分,沒有HEAP分配。

+1

讓我們看看創建對象的代碼以及對象或指向對象的指針 – Mark 2012-07-17 14:42:52

+0

Obejct非常大,所以我不能發佈整個代碼 - 它是通過new進行分配的,並且使用delete進行了釋放 - 您做了什麼?想要看到確切的 - 每個新的有一個刪除,每個新的[]有一個刪除[] ... – DenisD 2012-07-17 14:53:14

+0

如果你只這麼做,爲什麼不創建堆棧上的對象 - 所以不需要新的和刪除 – Mark 2012-07-17 14:56:19

回答

1

您可能想要使用更好,更強大的檢漏儀。您可能還需要使用能夠在程序運行時的不同時間輸出堆報告的泄漏檢測器。最後,你應該考慮你的問題可能是由堆碎片造成的,而不僅僅是泄漏。

您可以嘗試Visual Leak Detector這是免費的谷歌。

This question包含其他內存檢查產品的列表,從基本到相當先進/昂貴。 CRTDBG是最常見的分母解決方案;我已經與BoundsChecker好運,儘管它不是免費的。

+0

但CRT泄漏檢測器有什麼不同 - 它有什麼優勢? CRT是否檢測不到所有內容?爲什麼我應該使用虛擬泄漏檢測器? – DenisD 2012-07-17 14:55:24

+0

我擴大了我的答案 – antlersoft 2012-07-17 15:23:46

+0

@DenisD:從Google頁面:'主要區別是... Visual Leak Detector顯示用於內存分配的完整調用堆棧已導致泄漏。「# – tinman 2012-07-17 15:44:02

1

不知道你如何應用CRTDBG庫,但它提供了很多好吃的東西:

http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

您可以使用分和_CrtMemCheckpoint征服方式。它允許您測量代碼中兩點之間的內存使用差異。使用多線程可能很困難。

另一個是_CrtDumpMemoryLeaks(我認爲它是在應用程序結束時執行的),並啓用_CRTDBG_MAP_ALLOC,這應顯示內存分配的確切位置。

另一個提示是,也許你有你的CRTDBG過度配置,有很多小的分配它可以創建巨大的內部內存結構。

嘗試關閉部分代碼,並檢查問題是否仍然存在。

如果您每天構建應用程序,請嘗試運行以前的版本以發現問題出現的位置,然後比較源代碼庫中的更改。

...

+0

我使用_CrtDumpMemoryLeaks我在線程中運行的「主」對象被銷燬,線程退出後。它沒有顯示這個對象留下的任何東西。 – DenisD 2012-07-17 15:44:37