0

我啓用堆調試嘗試和調試一些內存泄漏錯誤。我這樣做包括以下內容:使用堆調試MS VC++ 2005

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

連同_CrtDumpMemoryLeaks()在一個感興趣的函數調用。

然後,我還編輯項目屬性配置,將調試類型設置爲'Native Only',並添加預處理器定義'_DEBUG'和C/C++代碼生成運行時間庫/MDd。我發現無論我把_CrtDumpMemoryLeaks()函數調用放在哪裏,它都會按如下方式轉儲內存泄漏輸出。

Detected memory leaks! 
Dumping objects -> 
{2606} normal block at 0x000000003D3A5370, 32 bytes long. 
Data: <VAR1> 54 48 45 52 4D 41 4C 5F 43 4F 4E 44 55 43 54 49 
{2605} normal block at 0x000000003D3A52E0, 32 bytes long. 
Data: <VAR2> 52 4F 43 4B 5F 48 45 41 54 5F 43 41 50 41 43 49 
{2604} normal block at 0x000000003D3A5250, 32 bytes long. 
Data: <VAR3> 45 51 55 49 4C 49 42 52 41 54 49 4F 4E 5F 52 45 
{2603} normal block at 0x000000003D3A51C0, 32 bytes long. 
Data: <VAR4> 4D 41 58 5F 57 41 54 45 52 5F 43 41 50 49 4C 4C 
{2602} normal block at 0x000000003D3A5130, 32 bytes long. 
Data: <VAR5> 4D 41 58 5F 47 41 53 5F 43 41 50 49 4C 4C 41 52 
{2601} normal block at 0x000000003D3A50A0, 32 bytes long. 
Data: <VAR6> 57 41 54 45 52 5F 43 4F 4D 50 52 45 53 53 49 42 
{2600} normal block at 0x000000003D3A5000, 48 bytes long. 

這是什麼意思?這是否意味着如果在調用點存在轉儲輸出,那麼在此之前實際發生錯誤/泄漏?我們可以肯定地得出結論嗎?如果不是,它似乎不是一個非常有用的工具。任何意見/幫助如何正確使用它或解釋方面的讚賞。謝謝!

回答

1

假設您有以下對:

int *x = new int[5]; 
int *y = new int[7]; 

delete[] y; 
_CrtDumpMemoryLeaks(); 
delete[] x; 

無論你刪除x後轉儲將包括x非釋放。實際上標準的MS技術需要高度的記憶管理技巧。爲了簡化您的生活,我的推薦是Visual Leak Detector - 易於嵌入您的項目並輕鬆定位錯誤(並且它是免費的)。

+0

謝謝..我會試試看。感謝您的迴應! –

+0

似乎只對2008/2010有效。你知道2005年的任何選擇嗎?沒關係,它看起來確實支持2005 ..會給它一個鏡頭。 –