CMemoryState Structure
Bietet eine bequeme Möglichkeit, Speicherverluste in Ihrem Programm zu erkennen.
Syntax
struct CMemoryState
Member
Öffentliche Konstruktoren
Name | Beschreibung |
---|---|
CMemoryState::CMemoryState | Erstellt eine klassenähnliche Struktur, die Speicherprüfpunkte steuert. |
Öffentliche Methoden
Name | Beschreibung |
---|---|
CMemoryState::Checkpoint | Ruft eine Momentaufnahme (Prüfpunkt) des aktuellen Speicherzustands ab. |
CMemoryState::D ifference | Berechnet den Unterschied zwischen zwei Objekten vom Typ CMemoryState . |
CMemoryState::D umpAllObjectsSince | Gibt eine Zusammenfassung aller aktuell zugeordneten Objekte seit einem vorherigen Prüfpunkt ab. |
CMemoryState::D umpStatistics | Druckt Speicherzuordnungsstatistiken für ein CMemoryState Objekt. |
Hinweise
CMemoryState
ist eine Struktur und verfügt nicht über eine Basisklasse.
Ein "Speicherverlust" tritt auf, wenn der Speicher für ein Objekt auf dem Heap zugeordnet, aber nicht zugeordnet wird, wenn es nicht mehr erforderlich ist. Solche Speicherverluste können schließlich zu Nichtspeicherfehlern führen. Es gibt mehrere Möglichkeiten zum Zuweisen und Zuordnen von Arbeitsspeicher in Ihrem Programm:
Verwenden der
malloc
/free
Funktionsfamilie aus der Laufzeitbibliothek.Verwenden der Windows-API-Speicherverwaltungsfunktionen
LocalAlloc
/LocalFree
und .GlobalAlloc
/GlobalFree
Verwenden von C++
new
unddelete
Operatoren.
Die CMemoryState
Diagnose hilft nur, Speicherverluste zu erkennen, die verursacht werden, wenn der mit dem new
Operator zugewiesene Arbeitsspeicher nicht mit delete
der Zuordnung behandelt wird. Die anderen beiden Gruppen von Speicherverwaltungsfunktionen sind für Nicht-C++-Programme vorgesehen, und das Mischen mit new
und delete
im selben Programm wird nicht empfohlen. Ein zusätzliches Makro, DEBUG_NEW, wird bereitgestellt, um den new
Operator zu ersetzen, wenn Sie Datei- und Zeilennummernverfolgung von Speicherzuweisungen benötigen. DEBUG_NEW wird immer verwendet, wenn Sie den new
Operator normalerweise verwenden würden.
Wie bei anderen Diagnosen sind die CMemoryState
Diagnosen nur in Debugversionen Ihres Programms verfügbar. Eine Debugversion muss die _DEBUG Konstante definiert haben.
Wenn Sie vermuten, dass Ihr Programm über einen Speicherverlust verfügt, können Sie die Checkpoint
Funktionen Difference
und DumpStatistics
die Funktionen verwenden, um den Unterschied zwischen dem Speicherzustand (objekten, die zugeordnet sind) an zwei verschiedenen Punkten bei der Programmausführung zu ermitteln. Diese Informationen können hilfreich sein, um zu bestimmen, ob eine Funktion alle objekte bereinigt, die sie zugeordnet.
Wenn Sie einfach wissen, wo das Ungleichgewicht bei der Zuordnung und der Deallocation auftritt, nicht genügend Informationen liefert, können Sie die DumpAllObjectsSince
Funktion verwenden, um alle Objekte abzubilden, die seit dem vorherigen Aufruf Checkpoint
zugeordnet sind. Dieses Dump zeigt die Reihenfolge der Zuordnung, die Quelldatei und Zeile, in der das Objekt zugewiesen wurde (wenn Sie DEBUG_NEW für die Zuordnung verwenden), und die Ableitung des Objekts, seine Adresse und seine Größe. DumpAllObjectsSince
ruft auch die Funktion jedes Dump
Objekts auf, um Informationen zum aktuellen Zustand bereitzustellen.
Weitere Informationen zur Verwendung CMemoryState
und anderen Diagnosen finden Sie unter Debuggen von MFC-Anwendungen.
Hinweis
Deklarationen von Objekten vom Typ CMemoryState
und Aufrufe von Memberfunktionen sollten durch #if defined(_DEBUG)/#endif
Direktiven in Klammern gesetzt werden. Dies führt dazu, dass die Speicherdiagnose nur in Debugbuilds Ihres Programms enthalten ist.
Vererbungshierarchie
CMemoryState
Anforderungen
Header: afx.h
CMemoryState::Checkpoint
Erstellt eine Momentaufnahme des Arbeitsspeichers und speichert ihn in diesem CMemoryState
Objekt.
void Checkpoint();
Hinweise
Die CMemoryState
Memberfunktionen Differenz und DumpAllObjectsSince verwenden diese Momentaufnahmedaten.
Beispiel
Sehen Sie sich das Beispiel für den CMemoryState-Konstruktor an.
CMemoryState::CMemoryState
Erstellt ein leeres CMemoryState
Objekt, das von der Memberfunktion "Prüfpunkt " oder "Differenz " ausgefüllt werden muss.
CMemoryState();
Beispiel
CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();
CMemoryState::D ifference
Vergleicht zwei CMemoryState
Objekte und speichert dann den Unterschied in diesem CMemoryState
Objekt.
BOOL Difference(
const CMemoryState& oldState,
const CMemoryState& newState);
Parameter
oldState
Der anfängliche Speicherstatus gemäß Definition eines CMemoryState
Prüfpunkts.
newState
Der neue Speicherstatus gemäß Definition eines CMemoryState
Prüfpunkts.
Rückgabewert
Nonzero, wenn die beiden Speicherzustände unterschiedlich sind; andernfalls 0.
Hinweise
Der Prüfpunkt muss für jeden der beiden Speicherzustandsparameter aufgerufen worden sein.
Beispiel
Sehen Sie sich das Beispiel für den CMemoryState-Konstruktor an.
CMemoryState::D umpAllObjectsSince
Ruft die Dump
Funktion für alle Objekte eines Typs auf, die von einer Klasse CObject
abgeleitet wurden, die zugewiesen wurden (und noch zugewiesen wurden) seit dem letzten Prüfpunktaufruf für dieses CMemoryState
Objekt.
void DumpAllObjectsSince() const;
Hinweise
Beim Aufrufen DumpAllObjectsSince
mit einem nicht initialisierten CMemoryState
Objekt werden alle Objekte, die sich derzeit im Arbeitsspeicher befinden, abbilden.
Beispiel
Sehen Sie sich das Beispiel für den CMemoryState-Konstruktor an.
CMemoryState::D umpStatistics
Druckt einen präzisen Speicherstatistikbericht aus einem CMemoryState
Objekt, das von der Funktion "Differenz"-Member gefüllt ist.
void DumpStatistics() const;
Hinweise
Der Bericht, der auf dem afxDump-Gerät gedruckt wird, zeigt Folgendes:
Ein Beispielbericht enthält Informationen zur Anzahl (oder Menge) von:
kostenlose Blöcke
normale Blöcke
CRT-Blöcke
Ignorieren von Blöcken
Clientblöcke
maximaler Vom Programm verwendeter Arbeitsspeicher zu einem beliebigen Zeitpunkt (in Bytes)
Gesamtspeicher, der derzeit vom Programm verwendet wird (in Bytes)
Freie Blöcke sind die Anzahl der Blöcke, deren Deallocation verzögert wurde, wenn afxMemDF
diese festgelegt delayFreeMemDF
wurde. Weitere Informationen finden Sie im Abschnitt "MFC-Makros und Globalen" unter "afxMemDF".
Beispiel
Der folgende Code sollte in projnameApp.cpp platziert werden. Definieren Sie die folgenden globalen Variablen:
static CMemoryState oldstate, newstate, diffstate;
Fügen Sie in der InitInstance
Funktion die Zeile hinzu:
oldstate.Checkpoint();
Fügen Sie einen Handler für die ExitInstance
Funktion hinzu, und verwenden Sie den folgenden Code:
newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
TRACE(_T("Memory leaked\n"));
diffstate.DumpStatistics();
}
Sie können das Programm jetzt im Debugmodus ausführen, um die Ausgabe der DumpStatistics
Funktion anzuzeigen.