2009-02-10 75 views
2

我正在寫一些Windows軟件,並終止時,我得到了很多不正確的內存泄漏消息的處理:與不正確的內存泄露報告在Windows

Detected memory leaks! 
Dumping objects -> 
{29745} normal block at 0x02938E38, 36 bytes long. 
Data: <, E    > 2C 0B 45 10 00 00 00 00 01 00 00 00 01 CD CD CD 
{29732} normal block at 0x02938C08, 500 bytes long. 
Data: <X)A   ` @> 58 29 41 10 00 00 00 00 01 00 00 00 60 93 0B 40 
{29721} normal block at 0x028DA8A0, 84 bytes long. 
Data: < 1D   0 %i> C8 31 44 10 00 00 00 00 01 00 00 00 30 85 25 69 

我敢肯定這是假陽性。你有處理這個問題的建議嗎?隨着軟件的發展,可能會出現一些實際的泄漏,至少可以說,發現它們將是困難的。

編輯
我應該提到,我使用了一個名爲OpenSceneGraph庫。它在引用計數的智能指針的內部大量使用。所有這些泄漏都是我new然後傳遞到庫中的實例,它立即將它包裝在ref_ptr<>中。我知道這些實例沒有泄漏,因爲我已經將fprintf添加到析構函數中,並且當智能指針超出範圍時我會看到消息。前一段時間,微軟有一個像標準庫一樣的問題,我想知道我在這裏看到類似的東西嗎?顯然這個bug與_CRT_BLOCKS被標記爲_NORMAL_BLOCKS有關。

編輯2

我想通了,這是怎麼回事。轉儲內存泄漏信息的代碼發生在所有靜態數據超出範圍之前。在一種情況下,內部對象是通過原型構造的,並且原型對象是靜態的,所以在atexit機器啓動之前不會被銷燬。所以,沒有什麼是真正的泄漏。它只是在應用程序拆卸發生之前發生轉儲。

+0

你怎麼能確定他們是誤報? – 2009-02-10 16:06:14

+0

我敢打賭你他們不是誤報。相反,我會花時間和資源來理解爲什麼會有內存泄漏。 你能發佈你的源代碼嗎? – cbrulak 2009-02-10 16:12:15

+0

我知道它們是誤報,因爲我添加了代碼以在構造函數和析構函數中記錄消息。我的日誌有兩個消息。 – criddell 2009-02-10 18:07:29

回答

2

哪個編譯器?

再拿分析/泄漏檢測工具爲好。 (的BoundsChecker等)

誤報我已經在過去得到了從來沒有妨礙我從尋找「真實」的泄漏。

我不同意那些認爲你錯誤地關注誤報的人 - 但要仔細檢查 - 檢查你所有的「新」,並追蹤應用邏輯,以說服你自己這些都是錯誤的。

您還可以在對象中添加警衛或標記或記憶簽名,以確保它們不是您創建的東西。

不知道該怎麼告訴你關於第三方的東西。我會聯繫第三方軟件公司,詢問他們是否知道任何問題 - 誤報或其他。

1

當我已經得到了之前的問題(的東西,似乎要被刪除顯示爲泄露),它通常是因爲我忘記了或者沒佔到指針賦值替換我new'd一。

然後,它「似乎」刪除就好了,而原來的new'd對象泄漏了。

2

我也會說這很有可能你有真正的韭菜(他們也可能在你使用的一些第三方代碼中)。

但有一種方法可以準確找到哪些分配沒有被釋放。 在這裏看到:http://msdn.microsoft.com/en-us/library/w2fhc9a3(VS.71).aspx

(當然,對於VS的其他版本,你必須在這個DLL的名稱更改:

{,,msvcr71d.dll}_crtBreakAlloc 

到正確的版本(msvcr90d.dll = VS 2008,msvcr80d.dll = VS 2005,msvcr71d.dll = VS 2003,msvcr70d.dll = VS 2002)

1

VS爲內存分配的泄漏內存報告在.dll中分配爲靜態(不使用MFC),因爲報告是原因).dll被刪除之前生成(並且在卸載dll時它們將被正確地解除分配)。因此,假陽性。