Gewusst wie: Erstellen von Speichersnapshots
Dieses Thema gilt für folgende Anwendungsbereiche:
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Nur "Systemeigen" |
||||
Pro, Premium und Ultimate |
Nur "Systemeigen" |
Tipp
Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Arbeiten mit Einstellungen.
Unter diesem Thema wird erläutert, wie Sie Speichermomentaufnahmen 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 die erste Speichermomentaufnahme erstellt.
Nachdem das Programm alle Speicherbelegungen und -freigaben vorgenommen hat, erstellen Sie ein weiteres CMemoryState-Objekt und rufen Checkpoint für dieses Objekt auf. Dadurch wird eine zweite Momentaufnahme erstellt, die 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.