background image

  Object dump complete.

  如果你没有用#define _CRTDBG_MAP_ALLOC 说明,内存漏洞堆存处类似下面这样:

  Detected memory leaks!

  Dumping objects ->

  {18} normal block at 0x00780E80, 64 bytes long.

  Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 

  Object dump complete.

  像你所知道的,当_CRTDBG_MAP_ALLOC 被定义时,_CrtDumpMemoryLeaks 给了你更
多的有用信息。如果_CRTDBG_MAP_ALLOC 没有被定义,那么将向你如下显示:

  

 

内存分配数值(花括号内)

  模块的类型(normal、client 或者 CRT  

  

 

以十六进制格式定位的内存

  

 

以字节计模块的大小

  

 

第一个十六字节的内容(也可以用十六进制)

  当定义了_CRTDBG_MAP_ALLOC 的时候,显示的内容也向你展现了出现泄漏内存所分
配地方的文件。在文件名之后括号内的数字(20,以此为例)是文件内的行数值。如果你
双击包含行数值和文件名的输出行,

    C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} normal 
block at 0x00780E80, 64 bytes long.

  指针将会跳到源文件中内存被分配地方的行(在上面的情况下, leaktest.cpp 的行号为
20)。选择输出行并按 F4 将有同样的效果。

  使用_CrtSetDbgFlag
  如果你的程序总是在同一各地方存在,那么调用_CrtDumpMemoryLeaks 时非常容易的。
但是,如果你的程序需要在多个位置退出该怎么办?在每一个可能的出口处如果不调用
_CrtDumpMemoryLeaks,你可在你的程序开始处包含下面的调用:

  _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

  当你的程序退出时,这个说明自动地调用_CrtDumpMemoryLeaks。你必须设置两个位域,
_CRTDBG_ALLOC_MEM_DF

 

和 _CRTDBG_LEAK_CHECK_DF,像以前说明的一样。