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:
#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 a GdiPlus::GdiPlusInitialize variable
to initialize GDI+ (GDI+ will be uninitialized, when destructor is called
for this variable).
-
GDIPLUS_USE_GDIPLUS_MEM
- GdipAlloc and GdipFree 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 use Gdiplus:: prefix.
Acknowledgements