Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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/freeA futtatókörnyezeti kódtár függvénycsaládjának használata.A Windows API memóriakezelési funkcióinak
LocalAlloc/LocalFreeésGlobalAlloc/GlobalFreea .A C++
newésdeleteaz 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.