background image

  翻译内存模块的类型
  像早期声明的一样,内存泄漏信息鉴别泄漏内存的每一个模块作为一个普通的模块、一
个客户模块或者一个 CRT 模块。实际上,普通的模块和客户模块是你可能留心的唯一类
型。

  一个普通模块(normal block)

 

是由你的程序分配的普通内存。

  一个客户模块 (client block)是一种特殊的内存模块,它由于需要一个析构函数的对象而
被 Microsoft Foundation  Classes (MFC)所使用。MFC new 操作子建立一个普通模块或者一

 

个客户模块,来适合被创建的模块。
一个 CTR 模块是由 CRT 库提供自己使用而分配的内存模块。CRT 库对这些模块来管理自
己的去分配,因此你不可能在内存泄漏报告中注意到这些,除非有些地方有严重的错误
(例如,CRT

 

库崩溃)。

在内存泄漏信息中有两种你从来没有见过的模块类型:

  空闲模块(free block)是一种被释放的内存模块 Ignore block 是你已经特殊标记过以至

 

于在内存泄漏报告中不会出现的模块。

  设置 CRT 报告样式
  像以前描写的一样,按默认方式, _CrtDumpMemoryLeaks 倾卸内存泄漏信息到输出窗
口的 Debug 窗格。你可以运用_CrtSetReportMode 重新设置它到堆存处,到另一个位置。如
果你使用一个库,它可能重新设置输出到另一个位置。在这种情况下,你能够利用下面的
说明来设置输出位置回到输出窗口:

  _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

  关于使用 _CrtSetReportMode 去发送输出信息到另一个位置,要看 Visual C++文件的
_CrtSetReportMode 节。

  在内存分配数目处设置一个断点
  在内存泄漏报告中的文件名和行号可告诉你泄漏的内存在那里被分配,但是了解内存在
那里分配对于鉴定问题不总是充分的。在一个程序运行过程中,经常是一个分配将会被调
用很多次,但是它可能在某次调用中泄漏内存。为了确定问题,你必须不但知道泄漏的内
存在那里分配,还要知道泄漏发生的条件。对你来说,使它成为可能的那条信息是内存分
配号。当那些被显示的时候,文件名和行号之后,这是在 curly brace 中出现的数值。例如,

在下面的输出中, 18”是内存分配号。它的意思是泄漏的内存是你程序中内存分配的第十
八个模块。

  Detected memory leaks!

  Dumping objects ->