GDI+ 和 MFC 内存泄漏检测






4.76/5 (16投票s)
2003年9月11日
2分钟阅读

113043

1334
GDI+ 和 MFC 内存泄漏检测
引言
当我开始在 VC++ 6.0 中使用 GDI+ 与 MFC 时,遇到了一些令人恼火的问题
- 无法在移除
DEBUG_NEW
宏的情况下编译我的 GDI+ 代码 - 无法在不调整我的代码的情况下编译 GDI+ 代码与 STL
- 无法检测内存泄漏
这里是解决方案!
如何使用
在 stdafx.h 中包含 GdiplusH.h
// GDI+ helper file
#include "GdiplusH.h"
特点
-
GDI+ 将在程序启动时初始化
-
您可以使用
_CrtXXX
函数来检测内存泄漏,设置分配断点,保存和比较内存状态等。 -
内存泄漏信息将转储到输出窗口 (MSVC IDE)
-
不再有
DEBUG_NEW
的编译问题 -
不再有 STL 的编译问题
内存泄漏检测
GDI+ 使用 GdipAlloc
和 GdipFree
为 GDI+ 对象分配内存。 它们可能在 gdiplus.dll 中拥有自己的内存分配列表,但不幸的是,没有导出的 API 来获取任何内存泄漏信息。 但是 GDI+ 对象可以位于堆栈上(例如:在函数中创建一个局部变量),因此对于这些内存区域没有特殊的初始化,因此我们不必使用 GdipAlloc
或 GdipFree
。 如果我们调用 CRT 调试版本的内存分配和删除函数,而不是 GdipAlloc
/Free
,我们可以使用众所周知的 _CrtXXX
函数轻松检测内存泄漏。
杂项定义
-
GDIPLUS_NO_AUTO_INIT -
GDI+ 不会在程序启动时初始化。 您必须创建一个GdiPlus::GdiPlusInitialize
变量来初始化 GDI+(当此变量的析构函数被调用时,GDI+ 将被取消初始化)。 -
GDIPLUS_USE_GDIPLUS_MEM -
GdipAlloc
和GdipFree
用于内存操作。 在这种情况下,无法使用 _Crt 函数来检测内存泄漏 -
GDIPLUS_NO_AUTO_NAMESPACE -
Gdiplus 命名空间将不会被定义为使用的命名空间。 在这种情况下,您必须使用Gdiplus::
前缀。