Click here to Skip to main content
13,287,856 members (38,038 online)
Click here to Skip to main content
Add your own
alternative version


55 bookmarked
Posted 21 May 2002

Detailed memory leak dumps from a console app

, 21 May 2002
Rate this:
Please Sign up or sign in to vote.
How to get path and line number info for memory leaks, in a console app


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


#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__;

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.


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.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Chris Losinger
Software Developer
United States United States
Chris Losinger is the president of Smaller Animals Software, Inc..

You may also be interested in...


Comments and Discussions

GeneralRe: THIS_FILE redefinition Problems Pin
Anonymous6-Jan-04 15:14
sussAnonymous6-Jan-04 15:14 
GeneralRe: THIS_FILE redefinition Problems Pin
Anonymous6-Jan-04 15:40
sussAnonymous6-Jan-04 15:40 
GeneralRe: THIS_FILE redefinition Problems Pin
Chris Losinger6-Jan-04 15:53
memberChris Losinger6-Jan-04 15:53 
GeneralRe: THIS_FILE redefinition Problems Pin
Anonymous7-Jan-04 4:11
sussAnonymous7-Jan-04 4:11 
"'ve declared the same variable twice"

Yup. I understand all of that completely. And I'm not just saying that! The end result is that you can't use this method of getting memory leaks and their origin, in header files. You can only use it in source (.cpp) files because of the problem you have just above described.

I was asking for any way around the problem, i.e. how to get this working for header files. I guess there just isn't one!

// myclass.h<br />
// Declaration and definition here (no .cpp)<br />
class MyClass<br />
{<br />
public:<br />
   MyClass () {}<br />
   ~MyClass () {}<br />
<br />
   void GenerateMemoryLeak ()<br />
   {<br />
      int *l = new int; // Memory leak!<br />
   }<br />

In other words, you can't spot the above memory leak using this method as is, because the leaking code is in a .h file with no .cpp file. Why would I have code like that? Because template classes need it so. A quick google found me this:[^] talks about it just in case some need a reminder...

Thanks for your assistance, regardless!
GeneralRe: THIS_FILE redefinition Problems Pin
Chris Losinger7-Jan-04 4:39
memberChris Losinger7-Jan-04 4:39 
GeneralRe: THIS_FILE redefinition Problems Pin
Anonymous7-Jan-04 5:34
sussAnonymous7-Jan-04 5:34 
GeneralRe: THIS_FILE redefinition Problems Pin
Anonymous7-Jan-04 5:39
sussAnonymous7-Jan-04 5:39 
Generalspecialized &quot;new&quot; is never called Pin
blizzymadden25-Nov-03 13:46
memberblizzymadden25-Nov-03 13:46 
GeneralLink Errors Pin
Christian Cheney19-Nov-02 6:59
sussChristian Cheney19-Nov-02 6:59 
GeneralRe: Link Errors Pin
Chris Losinger19-Nov-02 7:05
memberChris Losinger19-Nov-02 7:05 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.171207.1 | Last Updated 22 May 2002
Article Copyright 2002 by Chris Losinger
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid