内存、句柄泄露检测与调试

内存泄露检测

这段添加到测试代码的最前面 包含文件的下面
#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(调用堆栈)窗口和其它调试器信息以确定分配内存时的情况。如果必要,可以从该点继续执行程序,以查看对象发生了什么情况,或许可以确定未正确释放对象的原因。

 

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