La macro _CRTDBG_MAP_ALLOC ne fonctionne pas comme prévu

Cet article vous aide à résoudre le problème que l’allocation est signalée comme se produisant dans le fichier CRTDBG. h lorsqu’un objet est alloué par l' new opérateur et qu’il est vidé par les routines de débogage dans la bibliothèque Runtime C.

Version du produit d’origine :   Visual C++
Numéro de la base de connaissances initiale :   140858

Symptômes

Lorsqu’un objet est alloué à l’aide de l' new opérateur et vidé via l’utilisation des routines de débogage dans la bibliothèque Runtime C, l’allocation est signalée comme se produisant dans le fichier CRTDBG. h 512.

Cause

Cela est dû à la définition de l’opérateur surchargé new dans le fichier 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 */

Ici __FILE__ et __LINE__ sont des macros définies par le compilateur pour indiquer le nom de fichier et le numéro de ligne actuels. Les macros sont remplies par le préprocesseur. Le compilateur remplace alors votre appel à à l' new aide de cette fonction. Par conséquent, les macros ont déjà été remplies avant d’être Inline. Par conséquent, ils signalent les informations du fichier d’en-tête.

Résolution

La définition du _CRTDBG_MAP_ALLOC symbole entraîne le mappage correct de toutes les instances de new votre code à la version de débogage afin d' new enregistrer le fichier source et les informations de numéro de ligne.

Bien qu’il soit vrai que cela mappe les appels vers la version de débogage de new , il ne stocke pas le fichier source ou les informations de numéro de ligne appropriés. Il existe deux façons de marquer le nom de fichier et le numéro de ligne corrects :

  • Appelez directement la version de débogage de l' new opérateur.
  • Créez des macros qui remplacent l’opérateur new en mode débogage, comme dans l’exemple de code suivant.

Exemple de 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 );
}