Sdílet prostřednictvím


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 runtime

  • Použití funkcí LocalAlloc/ LocalFree správy paměti rozhraní API systému Windows a GlobalAlloc/ GlobalFree.

  • Použití jazyka C++ new a delete 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 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.

Viz také

Graf hierarchie