Memóriakezelés: Keretkiosztás

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.

A kereten való allokáció onnan kapta a nevét, hogy a függvény meghívásakor beállítanak egy "veremkeretet". A veremkeret a memória olyan területe, amely ideiglenesen tárolja a függvény argumentumait, valamint a függvényhez helyileg definiált változókat. A keretváltozókat gyakran "automatikus" változóknak nevezik, mert a fordító automatikusan lefoglalja számukra a helyet.

A keretkiosztásoknak két fő jellemzője van. Először is, ha meghatároz egy helyi változót, elegendő hely van lefoglalva a veremkereten a teljes változó tárolásához, még akkor is, ha az egy nagy tömb vagy adatstruktúra. Másodszor, a keretváltozók automatikusan törlődnek, amikor kimennek a hatókörből:

void MyFunction()
{
   // Local object created on the stack
   CString strName;
   // Object goes out of scope and is deleted as function ends
}

Helyi függvényváltozók esetén ez a hatókör-áttűnés akkor fordul elő, amikor a függvény kilép, de a keretváltozó hatóköre kisebb lehet, mint egy függvény, ha beágyazott zárójeleket használ. A keretváltozók automatikus törlése nagyon fontos. Egyszerű primitív típusok (például intbájtok), tömbök vagy adatstruktúrák esetén az automatikus törlés egyszerűen visszanyeri a változó által használt memóriát. Mivel a változó kilépett a hatókörből, ezért nem érhető el. C++ objektumok esetén azonban az automatikus törlés folyamata egy kicsit bonyolultabb.

Ha egy objektum keretváltozóként van definiálva, a rendszer automatikusan meghívja annak konstruktorát a definíció ütközésekor. Amikor az objektum kiesik a hatókörből, a rendszer automatikusan meghívja annak destruktorát, mielőtt az objektum memóriáját visszanyeri. Ez az automatikus építés és megsemmisítés nagyon hasznos lehet, de figyelnie kell az automatikus hívásokra, főként a destruktorra.

Az objektumok kereten való kiosztásának fő előnye, hogy automatikusan törlődnek. Ha az objektumokat a kereten foglalja le, nem kell aggódnia az elfelejtett objektumok miatt, amelyek memóriavesztést okoznak. (A memóriaszivárgással kapcsolatos részletekért lásd az MFC memóriaszivárgásainak észleléséről szóló cikket.) A keretkiosztás hátránya, hogy a keretváltozók nem használhatók a hatókörükön kívül. A keretfoglalás és a halomfoglalás kiválasztásának másik tényezője, hogy nagy struktúrák és objektumok esetében gyakran jobb a halom használata a verem helyett tárolásra, mivel a verem memória gyakran korlátozott.

Lásd még

Memóriakezelés