CMemoryState – struktura
Poskytuje pohodlný způsob, jak detekovat nevracení paměti v programu.
Syntaxe
struct CMemoryState
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CMemoryState::CMemoryState | Vytvoří strukturu třídou, která řídí kontrolní body paměti. |
Veřejné metody
Název | Popis |
---|---|
CMemoryState::Checkpoint | Získá snímek (kontrolní bod) aktuálního stavu paměti. |
CMemoryState::D ifference | Vypočítá rozdíl mezi dvěma objekty typu CMemoryState . |
CMemoryState::D umpAllObjectsSince | Zobrazí souhrn všech aktuálně přidělenýchobjektůch |
CMemoryState::D umpStatistics | Vytiskne statistiku přidělení paměti pro CMemoryState objekt. |
Poznámky
CMemoryState
je struktura a nemá základní třídu.
"Nevracení paměti" nastane, když je paměť pro objekt přidělena v haldě, ale není uvolněna, pokud již není vyžadována. Takové nevracení paměti může nakonec vést k chybám nedostatku paměti. Existuje několik způsobů, jak přidělit a uvolnit paměť v programu:
malloc
/free
Použití řady funkcí z knihovny runtimePoužití funkcí
LocalAlloc
/LocalFree
správy paměti rozhraní API systému Windows aGlobalAlloc
/GlobalFree
.Použití jazyka C++
new
adelete
operátorů
Diagnostika CMemoryState
pomáhá rozpoznat nevracení paměti způsobené pouze v případech, kdy je přidělena paměť pomocí new
operátoru uvolněna pomocí delete
. Další dvě skupiny funkcí správy paměti jsou určené pro programy mimo C++ a jejich kombinování se stejným programem new
a delete
ve stejném programu se nedoporučuje. Další makro, DEBUG_NEW, je k dispozici k nahrazení operátoru new
, pokud potřebujete sledování přidělení paměti a řádkového čísla. DEBUG_NEW se používá vždy, když byste operátor normálně používali new
.
Stejně jako u jiných diagnostických nástrojů CMemoryState
jsou diagnostika dostupná jenom v ladicích verzích programu. Ladicí verze musí mít definovanou _DEBUG konstantu.
Pokud máte podezření, že váš program nevracení paměti, můžete použít Checkpoint
Difference
, a DumpStatistics
funkce zjistit rozdíl mezi stavem paměti (přidělené objekty) ve dvou různých bodech při provádění programu. Tyto informace můžou být užitečné při určování, jestli funkce vyčistit všechny objekty, které přiděluje.
Pokud jednoduše víte, kde dochází k nerovnováhě přidělení a uvolnění, neposkytuje dostatek informací, můžete použít DumpAllObjectsSince
funkci k výpisu všech objektů přidělených od předchozího volání Checkpoint
. Tento výpis paměti zobrazuje pořadí přidělení, zdrojový soubor a řádek, kde byl objekt přidělen (pokud používáte DEBUG_NEW pro přidělení) a odvození objektu, jeho adresy a jeho velikosti. DumpAllObjectsSince
volá také funkci každého objektu Dump
, která poskytuje informace o aktuálním stavu.
Další informace o použití CMemoryState
a další diagnostice naleznete v tématu Ladění aplikací MFC.
Poznámka:
Deklarace objektů typu CMemoryState
a volání členských funkcí by měly být závorky direktivami #if defined(_DEBUG)/#endif
. To způsobí, že diagnostika paměti bude zahrnuta pouze do ladění sestavení programu.
Hierarchie dědičnosti
CMemoryState
Požadavky
Hlavička: afx.h
CMemoryState::Checkpoint
Pořídí shrnutí snímku paměti a uloží ho do tohoto CMemoryState
objektu.
void Checkpoint();
Poznámky
Členské CMemoryState
funkce Rozdíl a DumpAllObjectsSince používají tato data snímku.
Příklad
Viz příklad pro CMemoryState konstruktor.
CMemoryState::CMemoryState
Vytvoří prázdný CMemoryState
objekt, který musí být vyplněn kontrolním bodem nebo funkcí člena rozdílu .
CMemoryState();
Příklad
CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();
CMemoryState::D ifference
Porovná dva CMemoryState
objekty a uloží rozdíl do tohoto CMemoryState
objektu.
BOOL Difference(
const CMemoryState& oldState,
const CMemoryState& newState);
Parametry
oldState
Počáteční stav paměti definovaný kontrolním CMemoryState
bodem.
newState
Nový stav paměti definovaný kontrolním CMemoryState
bodem.
Návratová hodnota
Nenulové, pokud jsou dva stavy paměti odlišné; jinak 0.
Poznámky
Kontrolní bod musí být volána pro každý ze dvou parametrů stavu paměti.
Příklad
Viz příklad pro CMemoryState konstruktor.
CMemoryState::D umpAllObjectsSince
Dump
Volá funkci pro všechny objekty typu odvozené z třídyCObject
, které byly přiděleny (a jsou stále přiděleny) od posledního volání Kontrolní bod pro tento CMemoryState
objekt.
void DumpAllObjectsSince() const;
Poznámky
Volání DumpAllObjectsSince
s neinicializovaným CMemoryState
objektem vypíše všechny objekty, které jsou aktuálně v paměti.
Příklad
Viz příklad pro CMemoryState konstruktor.
CMemoryState::D umpStatistics
Vytiskne stručnou sestavu statistiky paměti z objektu CMemoryState
, který je vyplněn funkcí člena rozdílu .
void DumpStatistics() const;
Poznámky
Sestava, která se vytiskne na zařízení afxDump , ukazuje následující:
Ukázková sestava poskytuje informace o počtu (nebo množství):
volné bloky
normální bloky
Bloky CRT
ignorovat bloky
klientské bloky
maximální využití paměti programem najednou (v bajtech)
celková paměť aktuálně používaná programem (v bajtech)
Volné bloky jsou počet bloků, jejichž zrušení bylo zpožděno, pokud afxMemDF
bylo nastaveno na delayFreeMemDF
. Další informace najdete v tématu afxMemDF v části Makra a globální prostředí MFC.
Příklad
Následující kód by měl být umístěn v názvu projnameApp.cpp. Definujte následující globální proměnné:
static CMemoryState oldstate, newstate, diffstate;
InitInstance
Do funkce přidejte řádek:
oldstate.Checkpoint();
Přidejte obslužnou rutinu ExitInstance
funkce a použijte následující kód:
newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
TRACE(_T("Memory leaked\n"));
diffstate.DumpStatistics();
}
Teď můžete program spustit v režimu ladění a zobrazit výstup DumpStatistics
funkce.