2010年5月28日 星期五

How to detect memory leak

記憶體管理對C/C++程式開發是個很重要的議題, 在程式中配置記憶體很容易, 但什麼時間點該釋放記憶體, 就是個很麻煩的問題. 如果配置的記憶體不作釋放, 就會導致系統永遠無法取得那塊記憶體,而造成記憶體遺漏(Memory Leak), 若釋放不該釋放的記憶體, 程式運行到一半找不到對應的位址時, 也會造成程式當掉.上述的這些問題, 常常會發生在C/C++的初學者, 或已經習慣自動記憶體管理的程式員身上.

下面的步驟說明如何在C++的程式中, 偵測memory leak的發生.
  • 引用下列標頭檔
        #define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
  • 輸出記憶體洩漏資訊
    _CrtDumpMemoryLeaks();
  • 在Visual Studio中選擇Debug模式然後執行, 若程式中有發生記憶體遺漏, 其相關資訊將出現在輸出視窗中.
下面的程式範例中, 我們利用new配置了一個物件記憶體, 且不將其記憶體作釋放:


#define _CRTDBG_MAP_ALLOC

#include "stdafx.h"
#include "MyClass.h"
#include <stdlib.h>
#include <crtdbg.h>

int _tmain(int argc, _TCHAR* argv[])
{
CMyClass* pClass = new CMyClass();
//delete pClass;
pClass = NULL;
_CrtDumpMemoryLeaks();

return 0;
}


在輸出視窗中我們將觀看到記憶體遺漏的資訊如下:
Detected memory leaks!
Dumping objects ->
{86} normal block at 0x00397D98, 1 bytes long.
Data: < > CD
Object dump complete.
The program '[848] MemoryLeakTest.exe: Native' has exited with code 0 (0x0).


參考文章:
啟用記憶體遺漏偵測

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

沒有留言:

張貼留言