Setting memory allocation break point in watch window






4.67/5 (9 votes)
Memory leak detection in VC++
This tip helps to utilize the contex operator :
{,,msvcrxxd.dll}_crtBreakAllocMemory leaks in VC++ can be detected using debug heap function. To enable these, we should use:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
// 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:
#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()
;
void main()
{
// ....
_CrtDumpMemoryLeaks();
}
The leaks, if any, are shown in the Output window as:
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}_crtBreakAllocHere 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:
#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.