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

来源:互联网 发布:在淘宝怎样搜到冰毒 编辑:程序博客网 时间:2024/05/17 03:45

检测内存泄漏的主要工具是调试器和 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


原创粉丝点击