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
newoperador. - Cree macros que reemplacen al operador
newen 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 );
}