La macro _CRTDBG_MAP_ALLOC no funciona según lo esperado

Este artículo le ayuda a resolver el problema que indica que la asignación se produce en el archivo Crtdbg.h cuando el new operador asigna un objeto y lo vuelcan las rutinas de depuración de la biblioteca de C Run-Time.

Versión original del producto:   Visual C++
Número de KB original:   140858

Síntomas

Cuando un objeto se asigna mediante el new uso del operador y se volcado mediante el uso de las rutinas de depuración en la biblioteca de C Run-Time, la asignación se notifica como que se produce en la línea de archivos Crtdbg.h 512.

Causa

Esto se debe a la definición del operador new sobrecargado en el archivo Crtdbg.h :

#ifdef _CRTDBG_MAP_ALLOC
inline void* __cdecl operator new(unsigned int s)
    { return ::operator new(s, _NORMAL_BLOCK, __FILE__, __LINE__); }
#endif /* _CRTDBG_MAP_ALLOC */

Aquí __FILE__y __LINE__ son macros definidas por el compilador que notifican el nombre de archivo actual y el número de línea. El preprocesador rellena las macros. A continuación, el compilador reemplaza la llamada a por new esta función. Por lo tanto, las macros ya se han rellenado antes de que se inserten. Por lo tanto, notificarán la información del archivo de encabezado.

Solución

La definición del _CRTDBG_MAP_ALLOC símbolo hace que todas las instancias de en new el código se asignen correctamente a la versión de depuración de para registrar información de número de línea y archivo de new origen.

Aunque es cierto que esto asignará las llamadas a la versión de depuración de new, no almacenará el archivo de origen o la información de número de línea adecuada. Hay dos maneras de marcar el nombre de archivo y el número de línea correctos:

  • Llame directamente a la versión de depuración del new operador.
  • Cree macros que reemplacen al operador new en modo de depuración como en el código de ejemplo siguiente.

Código de ejemplo

/* 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 );
}