簡易 查詢VS2008控制檯記憶體洩露

YunShell發表於2013-12-02
     由於在學習C++,其中經常一個問題就是記憶體管理問題。
1.記憶體洩露問題
     就是通過動態分配的記憶體,但是在程式結束的時候,並沒有釋放掉,而導致的問題。這個問題特別出現在連續24小時工作的平臺上,一般有這樣的問題,時間一久就記憶體不斷減少,直至系統崩潰。
2.在MFC程式中,已經有了記憶體檢查機制。如何在控臺程式中也出現呢?
     希望的就是,在程式退出之前檢查是否有記憶體洩露,也就是動態申請的記憶體有沒有釋放掉。一旦有的話,就直接彈出一個對話方塊,提示。而且可以定位到具體哪行可能出現的洩露問題。
     將具體的資訊做成一個標頭檔案,然後放置到在每個工程中,再在程式中Include該標頭檔案。在main函式註冊一下。atexit(Exit)一下。具體的見下圖。

3.步驟
①新增測試檔案


如上是我建立的一個控制檯工程,將TestMemoryLeak.h加入到該工程中。該檔案的程式碼為:

#include <assert.h>
#ifdef _DEBUG
#define DEBUG_NORMALBLOCK    new( _NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NORMALBLOCK
#endif
#define _CRTDBG_MAP_ALLOC //新增記憶體對映資訊 可以看出在哪個檔案哪行 記憶體洩露
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_NORMALBLOCK
#endif

void Exit()
{
	int i = _CrtDumpMemoryLeaks(); //一旦有記憶體洩露返回 非0
	assert( i == 0); //assert後面是個布林值 為真 繼續執行。為假卡住
}


② 在控制檯程式中 include進去,然後在Mian函式註冊一下.h檔案中的有的函式 Exit.


③點選除錯 F5不是 Ctrl +F5.


發現了debug error.這是因為assert導致的。

④ 如何定位具體的哪個行程式碼呢?

在點選終止後,檢視輸出視窗。


看到了資訊。雙擊輸出的原始檔那行。自動定位到 記憶體洩露的地方。


具體標頭檔案中什麼意思。Exit函式什麼意思。可以自行查詢。這個只是簡單的在控制檯使用,因為只有一個出口,對於多出口的就不好使了。具體很多除錯技術,網上也有很多。

特別要注意的是:你控制檯程式的輸入輸出不要使用iostream.使用stdio.h。不然編譯不通過。


相關文章