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.