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

WinCE 的内存泄漏检测

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.83/5 (15投票s)

2001年6月13日

CPOL

2分钟阅读

viewsIcon

262188

downloadIcon

848

这段代码检测嵌入式 VC++ 中的内存泄漏,方式与 VC++ 中的 crtdbg 几乎相同。

引言

这段代码检测嵌入式 VC++ 中的内存泄漏,方式与 VC++ 中的 crtdbg 几乎相同。在程序结束时,它将在调试窗口中显示是否有任何内存泄漏,以及内存的状况,以便您可以确定内存泄漏发生的位置。如果没有内存泄漏,它将在调试窗口中显示一条消息,说明未检测到内存泄漏。这类似于 crtdbg.h 在 VC++ 中的作用。该代码检测使用 C++ 中 new 和 delete 运算符生成的内存泄漏。该代码不检测由 C 函数生成的内存泄漏:malloccallocfree,但将来可以实现。请告诉我,我会编写它。

有 3 个简单的步骤可以启用内存泄漏检测

  1. 定义 _DEBUG
    #define _DEBUG
  2. 包含 "crtdbg.h"
    #include "crtdbg.h"
  3. 让您的代码的第一行是
    _CrtSetDbgFlag (ON);

调试技巧

技巧 1

虽然它不会显示内存泄漏发生的行(请阅读技巧 2),但该实用程序会以十六进制显示地址,您可以在 operator new 函数中添加一小段代码,就在第一个 malloc 之后

	if (retPtr == (void*)0x76DA0)
		dumb instruction; <- place a breakpoint on this one

这样您就可以轻松地检测到代码的哪一行调用了 operator new 来在指定的地址分配内存而未被释放。

技巧 2

这是一个可以帮助您获取内存泄漏发生的确切行和文件名的技巧。 在每个文件中定义以下行,或者在头文件中定义它并在每个需要准确行和文件名的文件中包含它

#define new new(_T(__FILE__), __LINE__)

该代码实际上所做的是重写全局运算符 new,除了分配内存之外,它还保留指向已分配内存的指针。 operator delete 只是释放内存并从列表中删除对该内存的引用。 在程序结束时,列表中仍然存在的所有指针仅仅意味着内存泄漏,它们会显示在调试窗口中。

_CrtSetDbgFlag (ON); 只是声明一个 garbageCollector 实例。 它必须是您代码的第一行,以确保它是程序中最后一个要销毁的变量,因为在其析构函数中,它会执行指针列表的检查并显示内存泄漏。 因此,它的析构函数必须是最后一个被调用的析构函数。

许可证

公共领域

注释

请将任何错误报告给 Ciprian_Miclaus@yahoo.com。您可以自由地使用和分发此代码,但请保留这几行。如果您进行任何改进,或者对如何改进此代码有任何想法,或者您只是想以任何方式评论此代码,请将您的评论、想法、改进发送给我,发送到我的电子邮件地址。

WinCE 的内存泄漏检测 - CodeProject - 代码之家
© . All rights reserved.