Freigeben über


Aktivieren der Speicherverlusterkennung

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 wichtigsten Tools zum Feststellen von Speicherverlusten sind der Debugger und die Debugheapfunktionen der C-Laufzeitbibliotheken. Um die Debugheapfunktionen zu aktivieren, fügen Sie die folgenden Anweisungen in das Programm ein:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
Hinweis:

Die #include-Anweisungen müssen in der hier aufgeführten Reihenfolge angegeben werden. Falls Sie die Reihenfolge ändern, funktionieren die verwendeten Funktionen u. U. nicht einwandfrei.

Durch die Datei Crtdbg.h werden die malloc-Funktion und free-Funktion den entsprechenden Debugversionen _malloc_dbg und _free_dbg zugeordnet, mit deren Hilfe die Speicherreservierung und Freigabe nachverfolgt wird. Diese Zuordnung findet nur in einem Debugbuild (in dem _DEBUG definiert ist) statt. Releasebuilds verwenden die normalen Funktionen malloc und free.

Durch die #define-Anweisung werden die Basisversionen der CRT-Heapfunktionen den entsprechenden Debugversionen zugeordnet. Diese Anweisung ist nicht unbedingt erforderlich, ohne sie würde der zur Erkennung des Speicherverlusts generierte Dump jedoch weniger hilfreiche Informationen enthalten.

Nachdem Sie die vorherigen Anweisungen hinzugefügt haben, können Sie die Informationen zum Speicherverlust als Dump ausgeben, indem Sie die folgende Anweisung in das Programm einfügen:

_CrtDumpMemoryLeaks();

Beim Ausführen des Programms im Debugger werden die Speicherverlustdaten durch _CrtDumpMemoryLeaks im Ausgabefenster ausgegeben. Informationen zu Speicherverlusten sehen wie folgt aus:

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Wenn Sie die #define _CRTDBG_MAPALLOC-Anweisung nicht verwenden, sieht der Dump des Speicherverlusts wie folgt aus:

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Ohne die Definition von _CRTDBG_MAP_ALLOC wird Folgendes angezeigt:

  • Speicherreservierungsnummer (innerhalb der geschweiften Klammern).

  • Der Blocktyp, der normal, client oder CRT ist.

  • Speicheradresse im Hexadezimalformat.

  • Größe des Blockes in Bytes.

  • Der Inhalt der ersten 16 Bytes, auch im Hexadezimalformat.

Ist _CRTDBG_MAP_ALLOC definiert, wird zusätzlich die Datei angezeigt, in der der verlorene Speicherbereich reserviert wurde. Die Ziffer in Klammern hinter dem Dateinamen (in diesem Beispiel 20) gibt die Zeilennummer innerhalb der Datei an.

So wechseln Sie zu der Zeile in der Quelldatei, in der der Speicher reserviert ist

  • Doppelklicken Sie im Ausgabefenster auf die Zeile, in der Dateiname und Zeilennummer angegeben sind.

    - oder -

    Markieren Sie im Ausgabefenster die Zeile, in der Dateiname und Zeilennummer angegeben sind, und drücken Sie F4.

_CrtSetDbgFlag

Wenn das Programm immer an der gleichen Stelle endet, ist es ausreichend, _CrtDumpMemoryLeaks aufzurufen. Wenn das Programm an verschiedenen Stellen beendet werden kann, ist es möglich, den folgenden Aufruf am Anfang des Programms einzuschließen, anstatt an jedem möglichen Ende _CrtDumpMemoryLeaks aufzurufen:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

Durch diese Anweisung wird beim Beenden des Programms automatisch _CrtDumpMemoryLeaks aufgerufen. Sie müssen beide Bitfelder, _CRTDBG_ALLOC_MEM_DF und _CRTDBG_LEAK_CHECK_DF, wie oben beschrieben festlegen.

Festlegen des CRT-Berichtsmodus

Informationen zu Speicherverlusten werden von _CrtDumpMemoryLeaks standardmäßig im Debugbereich des Ausgabefensters ausgegeben, wie oben beschrieben. Mithilfe von _CrtSetReportMode können Sie diese Standardeinstellung zurücksetzen, um den Dump an einer anderen Stelle auszugeben. Bei Verwendung einer Bibliothek wird u. U. die Ausgabe an einer anderen Stelle aktiviert. In diesem Fall können Sie die Ausgabe wieder zurück an das Ausgabefenster leiten, indem Sie die folgende Anweisung einfügen:

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

Weitere Informationen finden Sie unter _CrtSetReportMode.

Siehe auch

Konzepte

Speicherverlusterkennung und -isolation