Das _CRTDBG_MAP_ALLOC-Makro funktioniert nicht wie erwartet.
Dieser Artikel hilft Ihnen bei der Behebung des Problems, dass die Zuordnung in der Datei "Crtdbg.h " auftritt, wenn ein Objekt vom new Operator zugewiesen und von den Debugroutinen in der C Run-Time Library abgelegt wird.
Originalversion des Produkts: Visual C++
Ursprüngliche KB-Nummer: 140858
Problembeschreibung
Wenn ein Objekt über den new Operator zugewiesen und über die Debugroutinen in der C Run-Time Library gespeichert wird, wird die Zuordnung in der Datei " Crtdbg.h "-Dateizeile 512 gemeldet.
Ursache
Dies wird durch die Definition des überladenen Operators new in der Datei "Crtdbg.h " verursacht:
#ifdef _CRTDBG_MAP_ALLOC
inline void* __cdecl operator new(unsigned int s)
{ return ::operator new(s, _NORMAL_BLOCK, __FILE__, __LINE__); }
#endif /* _CRTDBG_MAP_ALLOC */
Dies __FILE__sind __LINE__ makros, die vom Compiler definiert werden, die den aktuellen Dateinamen und die aktuelle Zeilennummer melden. Makros werden vom Präprozessor ausgefüllt. Anschließend ersetzt der Compiler Ihren Aufruf durch new diese Funktion. Daher wurden die Makros bereits ausgefüllt, bevor sie inline sind. Daher werden die Headerdateiinformationen gemeldet.
Lösung
Das Definieren des _CRTDBG_MAP_ALLOC Symbols bewirkt, dass alle Instanzen new in Ihrem Code ordnungsgemäß der Debugversion new zugeordnet werden, um Quelldatei- und Zeilennummerninformationen aufzuzeichnen.
Es stimmt zwar, dass dadurch Aufrufe an die Debugversion von newzugeordnet werden, es werden jedoch nicht die richtigen Quelldatei- oder Zeilennummerninformationen gespeichert. Es gibt zwei Möglichkeiten, den richtigen Dateinamen und die richtige Zeilennummer zu markieren:
- Rufen Sie die Debugversion des
newOperators direkt auf. - Erstellen Sie Makros, die den Operator
newim Debugmodus wie im folgenden Beispielcode ersetzen.
Beispielcode
/* 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 );
}