星期日, 4月 15, 2007

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

對於非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