Megosztás a következőn keresztül:


CMemoryState struktúra

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

Kényelmes módot kínál a memóriavesztések észlelésére a programban.

Szemantika

struct CMemoryState

Tagok

Nyilvános konstruktorok

Név Description
CMemoryState::CMemoryState Osztályszerű szerkezetet hoz létre, amely a memória ellenőrzőpontjait vezérli.

Nyilvános metódusok

Név Description
CMemoryState::Ellenőrzőpont Pillanatképet (ellenőrzőpontot) kér le az aktuális memóriaállapotról.
CMemoryState::D közömbösség Kiszámítja a két típusú CMemoryStateobjektum közötti különbséget.
CMemoryState::D umpAllObjectsSince Az összes jelenleg lefoglalt objektum összegzését adja ki egy korábbi ellenőrzőpont óta.
CMemoryState::D umpStatistics Egy objektum memóriafoglalási statisztikáit CMemoryState nyomtatja ki.

Megjegyzések

CMemoryState egy struktúra, és nem rendelkezik alaposztálysal.

A "memóriaszivárgás" akkor fordul elő, ha egy objektum memóriája a halomra van lefoglalva, de nem szabadít fel, ha már nincs rá szükség. Az ilyen memóriavesztések végül memóriakihasználtsághoz vezethetnek. A program több módon is lefoglalhatja és felszabadíthatja a memóriát:

  • malloc / free A futtatókörnyezeti kódtár függvénycsaládjának használata.

  • A Windows API memóriakezelési funkcióinak LocalAlloc/ LocalFree és GlobalAlloc/ GlobalFreea .

  • A C++ new és delete az operátorok használata.

A CMemoryState diagnosztika csak akkor segít észlelni a memóriaszivárgásokat, ha az new operátorral lefoglalt memória nincs felszabadítva delete. A memóriafelügyeleti függvények másik két csoportja nem C++-programokhoz tartozik, és nem ajánlott őket keverni newdelete ugyanabban a programban. A rendszer egy további makrót (DEBUG_NEW) biztosít az new operátor helyére, ha a memóriafoglalások fájl- és sorszámkövetésére van szüksége. DEBUG_NEW akkor használatos, amikor az operátort általában használja new .

A többi diagnosztikához hasonlóan a CMemoryState diagnosztika csak a program hibakeresési verzióiban érhető el. A hibakeresési verziónak meg kell határoznia a _DEBUG állandót.

Ha azt gyanítja, hogy a program memóriavesztéssel rendelkezik, a , Differenceés DumpStatistics a Checkpointfüggvények segítségével felderítheti a memóriaállapot (lefoglalt objektumok) közötti különbséget a program végrehajtásának két különböző pontján. Ez az információ hasznos lehet annak meghatározásához, hogy egy függvény megtisztítja-e az összes lefoglalt objektumot.

Ha egyszerűen tudja, hogy hol fordul elő a kiosztás és a felszabadítás egyensúlya, nem nyújt elegendő információt, a DumpAllObjectsSince függvény használatával az előző hívás óta lefoglalt összes objektumot ki tudja dobni Checkpoint. Ez a memóriakép a lefoglalás sorrendjét, a forrásfájlt és az objektum lefoglalási helyét (ha DEBUG_NEW használ a lefoglaláshoz), valamint az objektum származtatását, címét és méretét. DumpAllObjectsSince emellett meghívja az egyes objektumok függvényeit Dump , hogy információt adjanak az aktuális állapotáról.

A használatról CMemoryState és az egyéb diagnosztikáról további információt az MFC-alkalmazások hibakeresése című témakörben talál.

Megjegyzés:

A típusobjektumok CMemoryState deklarációit és a tagfüggvényekre irányuló hívásokat irányelvekkel #if defined(_DEBUG)/#endif kell zárójelbe tenni. Emiatt a memóriadiagnosztikát csak a program hibakeresési buildjei tartalmazzák.

Öröklési hierarchia

CMemoryState

Requirements

Fejléc: afx.h

CMemoryState::Ellenőrzőpont

Pillanatkép-összegzést készít a memóriáról, és ebben az CMemoryState objektumban tárolja.

void Checkpoint();

Megjegyzések

A CMemoryStateKülönbség és a DumpAllObjectsSince tagfüggvények ezt a pillanatkép-adatokat használják.

Example

Lásd a CMemoryState konstruktor példáját.

CMemoryState::CMemoryState

Egy üres CMemoryState objektumot hoz létre, amelyet az Ellenőrzőpont vagy a Különbség tagfüggvénynek kell kitöltenie.

CMemoryState();

Example

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

CMemoryState::D közömbösség

Két CMemoryState objektumot hasonlít össze, majd ebbe az objektumba CMemoryState tárolja a különbséget.

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

Paraméterek

oldState
Az ellenőrzőpont által CMemoryState meghatározott kezdeti memóriaállapot.

newState
Az ellenőrzőpont által CMemoryState meghatározott új memóriaállapot.

Visszaadott érték

Nonzero, ha a két memóriaállapot eltérő; egyéb esetben 0.

Megjegyzések

A két memóriaállapot-paraméter mindegyikéhez ellenőrzőpontot kellett meghívni.

Example

Lásd a CMemoryState konstruktor példáját.

CMemoryState::D umpAllObjectsSince

Meghívja a függvényt az Dump objektum legutóbbi Ellenőrzőpont-hívása óta lefoglalt (és továbbra is lefoglalt) osztályból CObject származtatott típusú összes objektumhozCMemoryState.

void DumpAllObjectsSince() const;

Megjegyzések

A nem inicializált CMemoryState objektumokkal való hívás DumpAllObjectsSince a memóriában lévő összes objektumot ki fogja dobni.

Example

Lásd a CMemoryState konstruktor példáját.

CMemoryState::D umpStatistics

Tömör memóriastatisztikai jelentést nyomtat ki egy CMemoryState objektumból, amelyet a Különbség tagfüggvény tölt ki.

void DumpStatistics() const;

Megjegyzések

Az afxDump eszközre nyomtatott jelentés a következőket jeleníti meg:

A mintajelentés az alábbiak számáról (vagy összegéről) ad információt:

  • szabad blokkok

  • normál blokkok

  • CRT-blokkok

  • blokkok figyelmen kívül hagyása

  • ügyfélblokkok

  • a program által egyszerre használt maximális memória (bájtban)

  • a program által jelenleg használt teljes memória (bájtban)

A szabad blokkok azoknak a blokkoknak a száma, amelyek felszabadítása késett, ha afxMemDF a beállítás értéke delayFreeMemDF. További információ: afxMemDF, az "MFC Makrók és globálisak" szakaszban.

Example

A következő kódot a projnameApp.cpp kell elhelyezni. Adja meg a következő globális változókat:

static CMemoryState oldstate, newstate, diffstate;

A függvényben InitInstance adja hozzá a következő sort:

oldstate.Checkpoint();

Adjon hozzá egy kezelőt a ExitInstance függvényhez, és használja a következő kódot:

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

Mostantól hibakeresési módban is futtathatja a programot a függvény kimenetének DumpStatistics megtekintéséhez.

Lásd még

hierarchiadiagram