Introduction
Finding memory leaks in a non-MFC app can be difficult
because the debugger doesn't display path and line number
info in the debug window. But, it's quite easy to
enable that info. Here's how:
Step 1
Copy this to a file called LeakWatcher.h
#ifndef IMWATCHINGYOULEAK
#define IMWATCHINGYOULEAK
#include <crtdbg.h>
#ifdef _DEBUG
void* operator new(size_t nSize, const char * lpszFileName, int nLine)
{
return ::operator new(nSize, 1, lpszFileName, nLine);
}
#define DEBUG_NEW new(THIS_FILE, __LINE__)
#define MALLOC_DBG(x) _malloc_dbg(x, 1, THIS_FILE, __LINE__);
#define malloc(x) MALLOC_DBG(x)
#endif
#endif
Step 2
Call _CrtDumpMemoryLeaks();
at the end of your program
(or wherever you want to see outstanding memory allocations).
Steps 3...N
Add this to each of your source files (after your last #include
) :
#include "LeakWatcher.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
What does it do?
This does the same thing an MFC app does -
it provides the path and line number of each allocation
to the C-runtime allocation routines. Those routines store
the path and line number for each allocation, and spit
them out when you call _CrtDumpMemoryLeaks();
. You should
recognize that little chunk of code in step 3 from every source
file that the AppWizard (and ClassWizard, mostly) has ever created.
Why not just use _CRTDBG_MAP_ALLOC?
#define _CRTDBG_MAP_ALLOC
will provide
file/line info for leaks caused by malloc
, but for leaks with new
,
it ends up telling you that the leak occurred in
crtdbg.h
(because that's where MS defined their new
) - not really useful.
Credits
This represents about ten minutes of searching
through Microsoft's C runtime and MFC source files.
So, all of the credit goes to MS. But, all of the
blame goes to MS, too, for not making this part of the non-MFC headers.
Anyway, have fun and be excellent to each other.