天天看点

非MFC程序启用内存泄漏检测

检测内存泄漏的主要工具是调试器和 CRT 调试堆函数。若要启用调试堆函数,请在程序中包括以下语句:

  1. #define CRTDBG_MAP_ALLOC
  2. #include <stdlib.h>
  3. #include <crtdbg.h>
  4. #include <afx.h>
注意

包含了afx.h之后,要将Project->Settings->C/C++->Category:Code Generation->Use run-time Library设置为相应的多线程先项

在每个头文件中加入以下语句:

 
          
  1. #ifdef _DEBUG
  2. #define new DEBUG_NEW
  3. #undef THIS_FILE
  4. static char THIS_FILE[] = __FILE__;
  5. #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