Debugversionen von Heapreservierungsfunktionen
Aktualisiert: November 2007
Dieses Thema gilt für folgende Anwendungsbereiche:
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
Nur "Systemeigen" |
|||
Standard |
Nur "Systemeigen" |
|||
Pro und Team |
Nur "Systemeigen" |
Tabellenlegende:
Vorhanden |
|
Nicht vorhanden |
|
Befehl oder Befehle, die standardmäßig ausgeblendet sind. |
Die C-Laufzeitbibliothek umfasst spezielle Debugversionen der Heapreservierungsfunktionen. Diese Funktionen haben dieselben Namen wie die Releaseversionen, gefolgt vom Suffix _dbg. In diesem Thema werden die Unterschiede zwischen der Releaseversion und der _dbg-Version einer CRT-Funktion beschrieben, wobei malloc und _malloc_dbg als Beispiele verwendet werden.
Wenn _DEBUG definiert wird, ordnet das CRT alle malloc-Aufrufe _malloc_dbg zu. Aus diesem Grund müssen Sie den Code nicht umschreiben, indem Sie malloc durch _malloc_dbg ersetzen, um die Vorteile beim Debuggen nutzen zu können.
Unter Umständen möchten Sie _malloc_dbg jedoch explizit aufrufen. Der explizite Aufruf von _malloc_dbg bietet zusätzliche Vorteile:
Nachverfolgen von _CLIENT_BLOCK-Reservierungen.
Speichern von Quelldatei und Zeilennummer an der Stelle, an der die Reservierung angefordert wurde.
Wenn Sie die malloc-Aufrufe nicht in _malloc_dbg-Aufrufe konvertieren möchten, erhalten Sie die Informationen zur Quelldatei auch durch die Definition von _CRTDBG_MAP_ALLOC. Dadurch werden alle malloc-Aufrufe vom Präprozessor direkt _malloc_dbg zugeordnet, sodass kein Wrapper für malloc erforderlich ist.
Um Reservierungstypen in Clientblöcken gesondert nachzuverfolgen, muss _malloc_dbg direkt aufgerufen und der blockType-Parameter auf _CLIENT_BLOCK festgelegt werden.
Wird _DEBUG nicht definiert, geschieht Folgendes: malloc-Aufrufe werden nicht behindert, _malloc_dbg-Aufrufe werden in malloc-Aufrufe aufgelöst, die Definition von _CRTDBG_MAP_ALLOC wird ignoriert, und es werden keine Quelldateiinformationen zur Reservierungsanforderung bereitgestellt. Da malloc keinen Blocktypparameter hat, werden _CLIENT_BLOCK-Anforderungen wie Standardreservierungen behandelt.