2011年5月27日 星期五

在Visual C++使用內建功能偵測memory leak

http://askalee.blogspot.com/2007/04/visual-cmemory-leak.html

對於非MFC的程式碼

啟動偵測memory leak :
在任何一個檔案中,如下定義_CRTDBG_MAP_ALLOC並同時引入兩個header

#define _CRTDBG_MAP_ALLOC
#include
#include

在程式最後呼叫 _CrtDumpMemoryLeaks();
或在程式一開頭呼叫 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


只要發現memory leak,就算發生leak的原始碼檔案中沒有引入前述header,還是會傾印出該leak訊息


似乎只有使用malloc所造成的memory leak才會得到完整的錯誤訊息,如:

c:\temp\testmemoryleakdetection\testmemoryleakdetection.cpp(16) : {106} normal block at 0x003A9FB0, 2 bytes long.
Data: < > CD CD


在無引入前述header的檔案中發生因new而導致的memory leak,其錯誤訊息如下:

c:\program files\microsoft visual studio 8\vc\include\crtdbg.h(1147) : {107} normal block at 0x003A3450, 4 bytes long.
Data: < > CD CD CD CD


在無引入前述header的檔案中發生因malloc而導致的memory leak,其錯誤訊息如下:

{107} normal block at 0x003A3450, 2 bytes long.
Data: < > CD CD


在有引入前述header的檔案中發生因new而導致的memory leak,其錯誤訊息如下:

c:\program files\microsoft visual studio 8\vc\include\crtdbg.h(1147) : {106} normal block at 0x003A9FB0, 4 bytes long.
Data: < > CD CD CD CD

這樣的訊息似乎沒有什麼作用,因為並沒有明確指出究竟是哪一部份的程式碼造成這個leak。也許有其他方法可以讓用new的錯誤也能產生完整的訊息。

MFC程式碼

MFC程式碼似乎不需做任何設定,自動就有在debug模式下偵測memory leak的功能。可以產生如下的錯誤訊息:

{126} normal block at 0x003AE548, 4 bytes long.
Data: < > CD CD CD CD


如果要產生完整的錯誤訊息,必須要在檔案前面加上

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

c:\temp\testmfcmemoryleak\testmfcmemoryleak.cpp(29) : {126} normal block at 0x003AE548, 4 bytes long.
Data: < > CD CD CD CD

沒有留言:

張貼留言