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


Halomfüggvények

Minden folyamathoz tartozik egy alapértelmezett halom, amelyet a rendszer biztosít. A halomból gyakran kiosztott alkalmazások privát halmok használatával javíthatják a teljesítményt.

A privát halom a hívási folyamat címterében található egy vagy több oldalból álló blokk. A privát halom létrehozása után a folyamat olyan függvényeket használ, mint a HeapAlloc és HeapFree a halom memóriájának kezeléséhez.

A halomfüggvények a GetProcessHeap függvény által visszaadott fogóponttal is kezelhetik a folyamat alapértelmezett halommemóriája memóriáját. Az új alkalmazásoknak a halomfüggvényeket kell használniuk a globális és helyi függvények helyett, erre a célra.

Nincs különbség a privát halomból lefoglalt és a többi memóriafoglalási függvény használatával lefoglalt memória között. A függvények teljes listáját a Memóriakezelési függvényektáblázatában találja.

Jegyzet

A szálnak csak a folyamat alapértelmezett halom- és privát halomfüggvényeihez kell meghívnia a halomfüggvényeket, amelyeket a szál létrehoz és kezel, a GetProcessHeap vagy HeapCreate függvény által visszaadott fogópontok használatával.

 

A HeapCreate függvény létrehoz egy privát halomobjektumot, amelyből a hívási folyamat lefoglalhat memóriablokkokat a HeapAlloc függvénnyel. HeapCreate a kezdeti méretet és a halom maximális méretét is meghatározza. A kezdeti méret határozza meg a halomhoz eredetileg lefoglalt lekötött, olvasási/írási lapok számát. A maximális méret határozza meg a fenntartott lapok teljes számát. Ezek a lapok egy összefüggő blokkot hoznak létre egy folyamat virtuális címterében, amelybe a halom növekedhet. Ha a HeapAlloc kérései túllépik a lekötött lapok aktuális méretét, a rendszer automatikusan véglegesít további oldalakat ebből a fenntartott területből, feltéve, hogy a fizikai tároló rendelkezésre áll. A lapok véglegesítése után a rendszer nem bontja ki őket, amíg a folyamat le nem fejeződik, vagy amíg a halom meg nem semmisül a HeapDestroy függvény meghívásával.

A privát halomobjektumok memóriája csak az azt létrehozó folyamat számára érhető el. Ha egy dinamikus csatolású kódtár (DLL) létrehoz egy privát halomtárat, az a DLL-nek nevezett folyamat címterében történik. Csak ehhez a folyamathoz érhető el.

A HeapAlloc függvény meghatározott számú bájtot foglal le egy privát halomból, és egy mutatót ad vissza a lefoglalt blokkhoz. Ez a mutató használható a HeapFree, HeapReAlloc, HeapSizeés HeapValidate függvényekben.

Az HeapAlloc által lefoglalt memória nem mozgatható. A HeapAlloc által visszaadott cím a memóriablokk felszabadításáig vagy újrakiosztásáig érvényes; a memóriablokkot nem kell zárolni.

Mivel a rendszer nem tudja tömöríteni a privát halom, töredezetté válhat. A különböző foglalási méretekben nagy mennyiségű memóriát lefoglaló alkalmazások a alacsony töredezettség-halom használhatják a halomtöredezettség csökkentésére.

A halomfüggvények egyik lehetséges funkciója egy privát halom létrehozása egy folyamat indításakor, amely megadja a folyamat memóriakövetelményeinek megfelelő kezdeti méretet. Ha a HeapCreate függvény hívása meghiúsul, a folyamat leállhat, vagy értesítheti a felhasználót a memóriahiányról; ha azonban sikerül, a folyamat garantáltan rendelkezik a szükséges memóriával.

A HeapCreate által igényelt memória nem feltétlenül egybefüggő. A halomban HeapAlloc által lefoglalt memória egybefüggő. A heapAlloc által lefoglalt HeapAllocáltal lefoglalt memóriaterületek között nem szabad írni vagy olvasni a memóriából.

Ne hivatkozzon semmilyen módon a heapFreeáltal felszabadított memóriára. A memória felszabadítása után az esetlegesen benne lévő információk örökre eltűnnek. Ha információra van szüksége, ne szabadíts fel memóriát, amely tartalmazza az információt. A memóriával kapcsolatos információkat visszaküldött függvényhívások (például HeapSize) nem használhatók szabad memóriával, mivel hamis adatokat adhatnak vissza.

A HeapDestroy függvény elpusztít egy privát halom objektumot. A halomobjektum összes lapját kibontja és felszabadítja, és érvényteleníti a fogópontot a halomra.

Memóriafoglalási módszerek összehasonlítása