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