Freigeben über


Speicherzustandsvergleich

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.

Ein weiteres Verfahren zum Ermitteln von Speicherverlusten besteht darin, zu bestimmten Zeitpunkten Snapshots von Speicherzuständen der Anwendung aufzuzeichnen. Die CRT-Bibliothek stellt den Strukturtyp _CrtMemState zur Verfügung, der zum Speichern von Snapshots des Arbeitsspeicherzustands verwendet werden kann:

_CrtMemState s1, s2, s3;

Um zu einem bestimmten Zeitpunkt einen Snapshot des Speicherzustands zu erstellen, übergeben Sie eine _CrtMemState-Struktur an die _CrtMemCheckpoint-Funktion. Durch diese Funktion wird ein Snapshot des aktuellen Speicherzustands in die Struktur eingefügt:

_CrtMemCheckpoint( &s1 );

Der Inhalt einer _CrtMemState-Struktur kann jederzeit in einem Dump ausgegeben werden, indem Sie die Struktur an die _CrtMemDumpStatistics-Funktion übergeben:

_CrtMemDumpStatistics( &s1 );

Diese Funktion gibt einen mit dem folgenden Beispiel vergleichbaren Dump der Speicherreservierungsinformationen aus:

0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
3071 bytes in 16 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 3071 bytes.
Total allocations: 3764 bytes.

Um festzustellen, ob in einem Codeabschnitt ein Speicherverlust aufgetreten ist, können Sie Snapshots des Speicherzustands vor und nach dem Abschnitt aufzeichnen und die beiden Zustände anschließend mithilfe von _CrtMemDifference vergleichen:

_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );

if ( _CrtMemDifference( &s3, &s1, &s2) )
   _CrtMemDumpStatistics( &s3 );

Wie die englische Bezeichnung bereits erkennen lässt, vergleicht _CrtMemDifference zwei Speicherzustände (s1 und s2) und generiert ein Ergebnis (s3), in dem die Unterschiede zwischen den beiden Zuständen beschrieben sind. Eine andere Möglichkeit, Speicherverluste zu ermitteln, besteht darin, _CrtMemCheckpoint-Aufrufe am Anfang und am Ende des Programms einzufügen und die Ergebnisse mit _CrtMemDifference zu vergleichen. Falls ein Speicherverlust auftritt, können Sie das Programm mithilfe von _CrtMemCheckpoint-Aufrufen unterteilen und den Verlust unter Verwendung binärer Suchverfahren lokalisieren.

Siehe auch

Konzepte

Speicherverlusterkennung und -isolation