Share via


CMemoryState-structuur

Opmerking

De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Biedt een handige manier om geheugenlekken in uw programma te detecteren.

Syntaxis

struct CMemoryState

Leden

Openbare constructors

Naam Description
CMemoryState::CMemoryState Hiermee wordt een klasseachtige structuur samengesteld waarmee geheugencontrolepunten worden gecontroleerd.

Openbare methoden

Naam Description
CMemoryState::Controlepunt Hiermee haalt u een momentopname (controlepunt) van de huidige geheugenstatus op.
CMemoryState::D deductie Berekent het verschil tussen twee objecten van het type CMemoryState.
CMemoryState::D umpAllObjectsSince Dumpt een samenvatting van alle momenteel toegewezen objecten sinds een eerder controlepunt.
CMemoryState::D umpStatistics Hiermee worden geheugentoewijzingsstatistieken voor een CMemoryState object afgedrukt.

Opmerkingen

CMemoryState is een structuur en heeft geen basisklasse.

Er treedt een 'geheugenlek' op wanneer het geheugen voor een object wordt toegewezen aan de heap, maar niet ongedaan wordt gemaakt wanneer deze niet meer nodig is. Dergelijke geheugenlekken kunnen uiteindelijk leiden tot onvoldoende geheugenfouten. Er zijn verschillende manieren om geheugen toe te wijzen en de toewijzing ervan ongedaan te maken in uw programma:

  • malloc / free De reeks functies uit de runtimebibliotheek gebruiken.

  • Met behulp van de windows API-geheugenbeheerfuncties LocalAlloc/ LocalFree en .GlobalAlloc/ GlobalFree

  • Gebruik de C++ new en delete operators.

De CMemoryState diagnostische gegevens helpen alleen geheugenlekken te detecteren die worden veroorzaakt wanneer het toegewezen geheugen met behulp van de new operator niet wordt toegewezen met behulp van delete. De andere twee groepen geheugenbeheerfuncties zijn voor niet-C++-programma's en het combineren ervan met new en delete in hetzelfde programma wordt niet aanbevolen. Er is een extra macro, DEBUG_NEW, beschikbaar om de new operator te vervangen wanneer u het bijhouden van geheugentoewijzingen en regelnummers nodig hebt. DEBUG_NEW wordt gebruikt wanneer u normaal gesproken de new operator zou gebruiken.

Net als bij andere diagnostische gegevens zijn de CMemoryState diagnostische gegevens alleen beschikbaar in foutopsporingsversies van uw programma. Voor een foutopsporingsversie moet de _DEBUG constante zijn gedefinieerd.

Als u vermoedt dat uw programma een geheugenlek heeft, kunt u de Checkpoint, Differenceen DumpStatistics functies gebruiken om het verschil te detecteren tussen de geheugenstatus (toegewezen objecten) op twee verschillende punten in de uitvoering van het programma. Deze informatie kan nuttig zijn bij het bepalen of een functie alle objecten opschoont die door deze functie worden toegewezen.

Als u alleen weet waar de onbalans in toewijzing en deallocatie optreedt, niet voldoende informatie biedt, kunt u de DumpAllObjectsSince functie gebruiken om alle objecten te dumpen die zijn toegewezen sinds de vorige aanroep naar Checkpoint. Deze dump toont de volgorde van toewijzing, het bronbestand en de regel waar het object is toegewezen (als u DEBUG_NEW gebruikt voor toewijzing) en de afleiding van het object, het adres en de grootte ervan. DumpAllObjectsSince roept ook de functie van Dump elk object aan om informatie te geven over de huidige status.

Zie MFC-toepassingen voor meer informatie over het gebruik CMemoryState en andere diagnostische gegevens.

Opmerking

Declaraties van objecten van het type CMemoryState en aanroepen van lidfuncties moeten tussen richtlijnen worden geplaatst #if defined(_DEBUG)/#endif . Dit zorgt ervoor dat geheugendiagnose alleen wordt opgenomen in foutopsporings builds van uw programma.

Overnamehiërarchie

CMemoryState

Requirements

koptekst: afx.h

CMemoryState::Controlepunt

Maakt een momentopnameoverzicht van het geheugen en slaat deze op in dit CMemoryState object.

void Checkpoint();

Opmerkingen

De CMemoryState lidfuncties Difference en DumpAllObjectsSince gebruiken deze momentopnamegegevens.

Example

Zie het voorbeeld voor de CMemoryState-constructor .

CMemoryState::CMemoryState

Hiermee wordt een leeg CMemoryState object samengesteld dat moet worden ingevuld door de functie Controlepunt of Verschillid .

CMemoryState();

Example

CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();

CMemoryState::D deductie

Vergelijkt twee CMemoryState objecten en slaat vervolgens het verschil op in dit CMemoryState object.

BOOL Difference(
    const CMemoryState& oldState,
    const CMemoryState& newState);

Parameterwaarden

oldState
De initiële geheugenstatus zoals gedefinieerd door een CMemoryState controlepunt.

newState
De nieuwe geheugenstatus zoals gedefinieerd door een CMemoryState controlepunt.

Retourwaarde

Niet-nul als de twee geheugenstatussen verschillen; anders 0.

Opmerkingen

Controlepunt moet zijn aangeroepen voor elk van de twee parameters voor de geheugenstatus.

Example

Zie het voorbeeld voor de CMemoryState-constructor .

CMemoryState::D umpAllObjectsSince

Roept de Dump functie aan voor alle objecten van een type dat is afgeleid van de klasse CObject die is toegewezen (en nog steeds worden toegewezen) sinds de laatste controlepunt-aanroep voor dit CMemoryState object.

void DumpAllObjectsSince() const;

Opmerkingen

Als u een niet-geïnitialiseerd CMemoryState object aanroeptDumpAllObjectsSince, worden alle objecten die momenteel in het geheugen aanwezig zijn, gedumpt.

Example

Zie het voorbeeld voor de CMemoryState-constructor .

CMemoryState::D umpStatistics

Hiermee drukt u een beknopt rapport met geheugenstatistieken af van een CMemoryState object dat is gevuld met de functie Verschillid .

void DumpStatistics() const;

Opmerkingen

Het rapport, dat wordt afgedrukt op het afxDump-apparaat , toont het volgende:

Een voorbeeldrapport bevat informatie over het aantal (of de hoeveelheid) van:

  • vrije blokken

  • normale blokken

  • CRT-blokken

  • blokken negeren

  • clientblokken

  • maximaal geheugen dat door het programma tegelijk wordt gebruikt (in bytes)

  • totaal geheugen dat momenteel wordt gebruikt door het programma (in bytes)

Vrije blokken zijn het aantal blokken waarvan de deallocatie is vertraagd als afxMemDF deze is ingesteld op delayFreeMemDF. Zie afxMemDF in de sectie MFC-macro's en globals voor meer informatie.

Example

De volgende code moet worden geplaatst in projnameApp.cpp. Definieer de volgende globale variabelen:

static CMemoryState oldstate, newstate, diffstate;

Voeg in de InitInstance functie de regel toe:

oldstate.Checkpoint();

Voeg een handler toe voor de ExitInstance functie en gebruik de volgende code:

newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
   TRACE(_T("Memory leaked\n"));
   diffstate.DumpStatistics();
}

U kunt het programma nu uitvoeren in de foutopsporingsmodus om de uitvoer van de DumpStatistics functie te zien.

Zie ook

Hiërarchiegrafiek