Sdílet prostřednictvím


Speicherzustandsvergleich

Aktualisiert: November 2007

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

C++

Web Developer

Express

Thema ist nicht vorhanden Thema ist nicht vorhanden

Nur "Systemeigen"

Thema ist nicht vorhanden

Standard

Thema ist nicht vorhanden Thema ist nicht vorhanden

Nur "Systemeigen"

Thema ist nicht vorhanden

Pro und Team

Thema ist nicht vorhanden Thema ist nicht vorhanden

Nur "Systemeigen"

Thema ist nicht vorhanden

Tabellenlegende:

Thema ist vorhanden

Vorhanden

Thema ist nicht vorhanden

Nicht vorhanden

Thema ist vorhanden, Befehl wird jedoch standardmäßig verborgen

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