Detailed memory leak dumps from a console app






4.79/5 (16 votes)
May 22, 2002
1 min read

208829
How to get path and line number info for memory leaks, in a console app
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 // _DEBUG #endif // #include guard
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.