Gewusst wie: Erstellen von Speichersnapshots
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. |
Hinweis: |
---|
Je nach den aktiven Einstellungen oder der verwendeten Version können sich die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen unterscheiden. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen. |
Unter diesem Thema wird erläutert, wie Sie Speichersnapshots erstellen, um einen Speicherverlust zu ermitteln.
So stellen Sie einen Speicherverlust fest
Erstellen Sie ein CMemoryState Members-Objekt, und rufen Sie die CMemoryState::Checkpoint-Memberfunktion auf. Dadurch wird der erste Speichersnapshot erstellt.
Nachdem das Programm alle Speicherreservierungen und -freigaben vorgenommen hat, erstellen Sie ein weiteres CMemoryState-Objekt und rufen Checkpoint für dieses Objekt auf. Dadurch wird ein zweiter Snapshot erstellt, der Aufschluss über die Arbeitsspeichernutzung gibt.
Erstellen Sie ein drittes CMemoryState-Objekt, rufen Sie die zugehörige CMemoryState::Difference-Memberfunktion auf, und übergeben Sie die ersten beiden CMemoryState-Objekte als Argumente. Wenn sich die beiden Speicherzustände unterscheiden, gibt die Difference-Funktion einen Wert ungleich 0 (Null) zurück. Dies deutet darauf hin, dass einige Speicherblöcke nicht freigegeben wurden.
Dieses Beispiel veranschaulicht den dazugehörigen Code:
// Declare the variables needed #ifdef _DEBUG CMemoryState oldMemState, newMemState, diffMemState; oldMemState.Checkpoint(); #endif // Do your memory allocations and deallocations. CString s("This is a frame variable"); // The next object is a heap object. CPerson* p = new CPerson( "Smith", "Alan", "581-0215" ); #ifdef _DEBUG newMemState.Checkpoint(); if( diffMemState.Difference( oldMemState, newMemState ) ) { TRACE( "Memory leaked!\n" ); } #endif
Beachten Sie, dass die Speicherüberprüfungsanweisungen in #ifdef _DEBUG / #endif-Blöcke eingeschlossen sind und daher nur in Win32-Debugversionen des Programms kompiliert werden.
Da Sie nun wissen, dass ein Speicherverlust auftritt, können Sie eine andere Memberfunktion, CMemoryState::DumpStatistics, zum Anzeigen einer Speicherstatistik verwenden, um die Stelle zu lokalisieren.