Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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/freePoužití řady funkcí z knihovny runtimePoužití funkcí
LocalAlloc/LocalFreesprávy paměti rozhraní API systému Windows aGlobalAlloc/GlobalFree.Použití jazyka C++
newadeleteoperá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 CheckpointDifference, 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.