GDI+ and MFC memory leak detection






4.76/5 (16 votes)
Sep 11, 2003
2 min read

112015

1334
GDI+ and MFC memory leak detection
Introduction
When I started to use GDI+ with MFC in VC++ 6.0 I ran into some annoying problems:
- Couldn't compile my GDI+ code with MFC without removing the
DEBUG_NEW
macros - Couldn't compile GDI+ code with STL without tweaking my code
- Couldn't detect memory leaks
Here is the solution!
How to use
Include GdiplusH.h in stdafx.h:
// GDI+ helper file
#include "GdiplusH.h"
Features
-
GDI+ will be initialized when program starts
-
You can use
_CrtXXX
functions to detect memory leaks, set an allocation breakpoint, save and compare memory states, etc. -
Memory leak information will be dumped to output window (MSVC IDE)
-
No more compilation problem with
DEBUG_NEW
-
No more compilation problem with STL
Memory leak detection
GDI+ is using GdipAlloc
and GdipFree
for allocating memory for GDI+ objects.
Probably they have their own memory allocation lists in gdiplus.dll, but
unfortunately there is no exported API to get any memory leak information. But
GDI+ objects can be located on stack (for example: creating a local variable in
a function), so there is no special initialization for these memory regions, so
we do not have to use GdipAlloc
or GdipFree
. If we
call the CRT debug version of memory allocation and deletion functions instead
of GdipAlloc
/Free
, we can detect memory leaks very
easily using the well known _CrtXXX
functions.
Miscellaneous defines
-
GDIPLUS_NO_AUTO_INIT -
GDI+ won't be initialized at program startup. You have to create aGdiPlus::GdiPlusInitialize
variable to initialize GDI+ (GDI+ will be uninitialized, when destructor is called for this variable). -
GDIPLUS_USE_GDIPLUS_MEM -
GdipAlloc
andGdipFree
is used for memory operations. In this case _Crt functions cannot be used to detect memory leaks -
GDIPLUS_NO_AUTO_NAMESPACE -
Gdiplus namespace won't be defined as a used namespace. In this case you have to useGdiplus::
prefix.