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 und delete Operatoren.

Die CMemoryState Diagnose hilft nur, Speicherverluste zu erkennen, die verursacht werden, wenn der mit dem new Operator zugewiesene Arbeitsspeicher nicht mit deleteder 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 CheckpointFunktionen Differenceund 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 Checkpointzugeordnet 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 delayFreeMemDFwurde. 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.

Siehe auch

Hierarchiediagramm