Microsoft KB Archive/140858

= The _CRTDBG_MAP_ALLOC macro does not work as expected =

Article ID: 140858

Article Last Modified on 6/2/2005

-

APPLIES TO

 The C Run-Time (CRT), when used with:  Microsoft Visual C++ 4.0 Standard Edition

 Microsoft Visual C++ 4.1 Subscription

 Microsoft Visual C++ 5.0 Enterprise Edition

 Microsoft Visual C++ 5.0 Professional Edition</li></ul>

 Microsoft Visual C++ 6.0 Enterprise Edition</li></ul>

 Microsoft Visual C++ 6.0 Professional Edition</li></ul>

 Microsoft Visual C++ 6.0 Standard Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q140858

<div class="symptoms_section">

SYMPTOMS
When an object is allocated through use of the New operator and dumped through use of the debugging routines in the C Run-Time Library, the allocation is reported as occurring in the Crtdbg.h file line 512.

<div class="cause_section">

CAUSE
This is caused by the definition of the overloaded operator New in the Crtdbg.h file: #ifdef _CRTDBG_MAP_ALLOC inline void* __cdecl operator new(unsigned int s)        { return ::operator new(s, _NORMAL_BLOCK, __FILE__, __LINE__); } #endif /* _CRTDBG_MAP_ALLOC */ Here __FILE__ and __LINE__ are macros defined by the compiler that report the current file name and line number. Macros are filled out by the preprocessor. Then the compiler replaces your call to New with this function. Therefore, the macros have already been filled out before they are inlined. Hence they will report the header file information.

<div class="moreinformation_section">

MORE INFORMATION
The Books Online section titled "Using the Debug Heap from C++" in the Run-Time Library Reference states that defining the _CRTDBG_MAP_ALLOC symbol causes all instances of New in your code to be mapped properly to the debug version of New so as to record source file and line number information.

While it is true that this will map calls to the debug version of New, it will not store the proper source file or line number information. There are two ways to mark the correct file name and line number:


 * Call the debug version of the new operator directly -or-


 * Create macros that replace the operator new in debug mode as in the following sample code.

Sample Code
/* MyDbgNew.h  /* Defines global operator new to allocate from /* client blocks */   #ifdef _DEBUG #define MYDEBUG_NEW  new( _NORMAL_BLOCK, __FILE__, __LINE__) // Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the //allocations to be of _CLIENT_BLOCK type #else #define MYDEBUG_NEW #endif // _DEBUG

/* MyApp.cpp /* Compile options needed: /Zi /D_DEBUG /MLd /*           or use a   /*      Default Workspace for a Console Application to   /*      build a Debug version */

#include "crtdbg.h"  #include "mydbgnew.h"

#ifdef _DEBUG #define new MYDEBUG_NEW #endif

void main { char *p1; p1 = new char[40]; _CrtMemDumpAllObjectsSince( NULL ); }

Additional query words: kbCRT kbOLDocs kbDSupport

Keywords: kbtshoot kbprb kbdocerr KB140858

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.