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

GDI+ 和 MFC 内存泄漏检测

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (16投票s)

2003年9月11日

2分钟阅读

viewsIcon

113043

downloadIcon

1334

GDI+ 和 MFC 内存泄漏检测

引言

当我开始在 VC++ 6.0 中使用 GDI+ 与 MFC 时,遇到了一些令人恼火的问题

  1. 无法在移除 DEBUG_NEW 宏的情况下编译我的 GDI+ 代码
  2. 无法在不调整我的代码的情况下编译 GDI+ 代码与 STL
  3. 无法检测内存泄漏

这里是解决方案!

如何使用

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:: 前缀。

致谢

© . All rights reserved.