65.9K
CodeProject 正在变化。 阅读更多。
Home

捕获内存泄漏

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.08/5 (11投票s)

2000年9月12日

viewsIcon

225530

downloadIcon

1536

如何毫不费力地捕获内存泄漏。

引言

我想和大家分享一些捕捉内存泄漏的经验。在大多数情况下,这是一个漫长的过程,需要像 PurifyNT 或 BoundsChecker 这样的额外工具。实际上,使用微软导出的功能可以捕捉简单的内存泄漏。

在简单的情况下,你应该在 'StdAfx.h' 中添加几行代码。

#ifdef _DEBUG
   #define _CRTDBG_MAP_ALLOC // include Microsoft memory leak detection procedures
   #define _INC_MALLOC	     // exclude standard memory alloc procedures
#endif

注意:这应该在 'include' 指令之前。

在附带的示例中,你将找到一个包含内存泄漏的示例。要了解它的工作原理,你应该在调试器下运行程序。当程序完成时,你将在“输出”窗口的“调试”选项卡中看到以下消息。

Detected memory leaks!
Dumping objects -> D:\Projects\CrtDbg\CrtDbg.cpp(25) : {53} normal block at 0x002F26C0, 10 bytes long.
Data: <MemoryLeak> <MEMORYLEAK> 4D 65 6D 6F 72 79 4C 65 61 6B 
Object dump complete.

在更高级的内存管理情况下,你应该查看 MFC 源代码目录中的 'AfxMem.cpp' 文件。该文件包含大量的内存管理函数。

我编写了一个类 CMemDiff,它封装了 CMemoryState 并帮助跟踪内存泄漏。只需将 MemDiff 文件包含在你的项目中。声明了一个类型为 CMemDiff 的全局变量,它的构造函数和析构函数将在程序的开始和结束时检查你的内存状态并报告任何泄漏。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.