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
沒有留言:
張貼留言