內存、句柄泄露檢測與調試

內存泄露檢測

這段添加到測試代碼的最前面 包含文件的下面
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#ifdef _DEBUG
#define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

這個添加到main函數的第一行
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF| _CRTDBG_LEAK_CHECK_DF);

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

這個是跳轉到泄露處
 _CrtSetBreakAlloc(142389);//括號內數字爲 檢測結果中花括號中的數字,爲申請內存的序號

或者在監視器中調試:

在程序起始附近設置一個位置斷點。當程序在該點中斷時,可以從 QuickWatch(快速監視)對話框或 Watch(監視)窗口設置一個內存分配斷點:

例如,在 Watch 窗口中,在 Name 欄鍵入下面的表達式:   

_crtBreakAlloc

如果要使用 CRT 庫的多線程 DLL 版本(/MD 選項),那麼必須包含上下文操作符,像這樣:   

{,,msvcrtd.dll}_crtBreakAlloc

現在按下回車鍵,調試器將計算該值並把結果放入 Value 欄。如果沒有在內存分配點設置任何斷點,該值將爲 –1。

用你想要在其位置中斷的內存分配的分配序號替換 Value 欄中的值。例如輸入 45。這樣就會在分配序號爲 45 的地方中斷。

在所感興趣的內存分配處設置斷點後,可以繼續調試。這時,運行程序時一定要小心,要保證內存塊分配的順序不會改變。當程序在指定的內存分配處中斷時,可以查看 Call Stack(調用堆棧)窗口和其它調試器信息以確定分配內存時的情況。如果必要,可以從該點繼續執行程序,以查看對象發生了什麼情況,或許可以確定未正確釋放對象的原因。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章