Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
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/freeDe reeks functies uit de runtimebibliotheek gebruiken.Met behulp van de windows API-geheugenbeheerfuncties
LocalAlloc/LocalFreeen .GlobalAlloc/GlobalFreeGebruik de C++
newendeleteoperators.
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.