检测内存泄漏的主要工具是调试器和 CRT 调试堆函数。若要启用调试堆函数,请在程序中包括以下语句:
- #define CRTDBG_MAP_ALLOC
- #include <stdlib.h>
- #include <crtdbg.h>
- #include <afx.h>
包含了afx.h之后,要将Project->Settings->C/C++->Category:Code Generation->Use run-time Library设置为相应的多线程先项
在每个头文件中加入以下语句:
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
注意 #include
语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作。
_CrtSetDbgFlag 如果程序总在同一位置退出,则调用 _CrtDumpMemoryLeaks
足够方便,但如果程序可以从多个位置退出该怎么办呢?不要在每个可能的出口放置一个对 _CrtDumpMemoryLeaks
的调用,可以在程序开始包括以下调用:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 该语句在程序退出时自动调用 _CrtDumpMemoryLeaks 。必须同时设置 _CRTDBG_ALLOC_MEM_DF 和
_CRTDBG_LEAK_CHECK_DF 两个位域,如上所示。
更多详细说明参考MSDN .NET 2003 ms-help://MS.MSDNQTR.2003FEB.2052/vsdebug/html/vxconenablingmemoryleakdetection.htm 另外: 在内存分配编号上设置断点:
在Watch窗口中Name栏中输入以下语句:
单线程: _crtBreakAlloc
多线程: VC6输入{,,msvcrtd.dll}_crtBreakAlloc
VC7输入{,,msvcr71d.dll}_crtBreakAlloc
再将内存分配编号输入Value栏中,按Enter.当程序执行到分配编号为Value栏中的值的内存块时就会中断.
详见 MSDN .NET 2003 ms-help://MS.MSDNQTR.2003FEB.2052/vsdebug/html/vxconsettingbreakpointonmemoryallocationnumber.htm