Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / VisualC++

Setting memory allocation break point in watch window

4.67/5 (9 votes)
5 Feb 2012CPOL 30.5K  
Memory leak detection in VC++
This tip helps to utilize the contex operator :
{,,msvcrxxd.dll}_crtBreakAlloc

Memory leaks in VC++ can be detected using debug heap function. To enable these, we should use:
C++
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

C++
// Note that in the above code, the order of #include statements must not change

And to track memory (leaks) allocated via 'new', we can use:
C++
#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

Now at the end of main() or at the point of interest in the code, we should call _CrtDumpMemoryLeaks();
C++
void main()
{
   // ....
  _CrtDumpMemoryLeaks();
}

The leaks, if any, are shown in the Output window as:
XML
C:\Projects\Sample\main.cpp(10) : {30} normal block at 0x00780E80, 64 bytes long.
 Data: <> CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD


We can utilize the memory allocation number (30 in the above example) to identify the code which caused the leak. To do this, we can use _crtBreakAlloc or the context operator in the watch window:
{,,msvcrxxd.dll}_crtBreakAlloc

Here xx should be replaced by the version of Visual Studio.
90 for VS2008
80 for VS2005 ...
In the watch window, the value of this wil be -1 initially and we can then set it to our memory allocation number to break at the appropiate code block.

To consolidate, all we have to do is this:
C++
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

void main()
{
   int* i = new int;
   // .....
   // the memory allocated with pointer i is not released and will be shown as leak
  _CrtDumpMemoryLeaks();
}


Hope now it is usable in the real world.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)