Sdílet prostřednictvím


Funkce haldy

Každý proces má výchozí haldu, kterou systém poskytuje. Aplikace, které z haldy často přidělují, můžou zvýšit výkon pomocí privátních hald.

Privátní halda je blok jedné nebo více stránek v adresním prostoru volajícího procesu. Po vytvoření privátní haldy proces používá funkce, jako jsou HeapAlloc a HeapFree ke správě paměti v této haldě.

Funkce haldy lze také použít ke správě paměti ve výchozí haldě procesu pomocí popisovače vrácené funkcí GetProcessHeap. Nové aplikace by pro tento účel měly používat funkce haldy místo globální a místní funkce.

Mezi pamětí přidělenou privátní haldou a přidělenou pomocí ostatních funkcí přidělení paměti není žádný rozdíl. Úplný seznam funkcí naleznete v tabulce Funkce správy paměti.

Poznámka

Vlákno by mělo volat funkce haldy pouze pro výchozí haldu procesu a privátní haldy, které vlákno vytváří a spravuje, pomocí popisovačů vrácených GetProcessHeap nebo HeapCreate funkce.

 

Funkce HeapCreate vytvoří privátní objekt haldy, ze kterého může volající proces přidělit bloky paměti pomocí funkce HeapAlloc. heapCreate určuje počáteční i maximální velikost haldy. Počáteční velikost určuje počet potvrzenýchstránekch Maximální velikost určuje celkový počet rezervovaných stránek. Tyto stránky vytvoří souvislý blok ve virtuálním adresním prostoru procesu, do kterého může halda růst. Další stránky se automaticky potvrdí z tohoto vyhrazeného prostoru, pokud požadavky HeapAlloc překračují aktuální velikost potvrzených stránek za předpokladu, že je k dispozici fyzické úložiště. Jakmile jsou stránky potvrzeny, nebudou dekódovány, dokud se proces neukončí nebo dokud nebude halda zničena voláním funkce HeapDestroy.

Paměť privátního objektu haldy je přístupná pouze pro proces, který ho vytvořil. Pokud dynamická knihovna (DLL) vytvoří privátní haldu, provede to v adresních prostorech procesu, který se nazývá knihovna DLL. Je přístupný pouze pro tento proces.

Funkce HeapAlloc přidělí zadaný počet bajtů z privátní haldy a vrátí ukazatel na přidělený blok. Tento ukazatel lze použít v heapFree, HeapReAlloc, HeapSizea Funkce HeapValidate.

Paměť přidělená heapAlloc není možné přesouvat. Adresa vrácená heapAlloc je platná, dokud se blok paměti neuloží nebo nevrátí. blok paměti nemusí být uzamčen.

Vzhledem k tomu, že systém nemůže komprimovat privátní haldu, může být fragmentován. Aplikace, které přidělují velké množství paměti v různých velikostech přidělení, mohou použít haldu s nízkou fragmentací k omezení fragmentace haldy.

Možným použitím funkcí haldy je vytvoření privátní haldy při spuštění procesu a určení počáteční velikosti dostatečné pro splnění požadavků na paměť procesu. Pokud volání funkce HeapCreate selže, proces může ukončit nebo upozornit uživatele o nedostatku paměti; pokud však bude úspěšný, proces bude mít jistotu, že bude mít paměť, která potřebuje.

Paměť požadovaná heapCreate může nebo nemusí být souvislá. Paměť přidělená v haldě heapAlloc je souvislá. Neměli byste zapisovat do paměti ani číst z paměti v haldě s tím rozdílem, že přiděleno HeapAlloc, ani byste neměli předpokládat žádný vztah mezi dvěma oblastmi paměti přidělenými HeapAlloc.

Neměli byste odkazovat žádným způsobem na paměť, který byl uvolněn HeapFree. Jakmile se paměť uvolní, všechny informace, které mohly být v ní, jsou navždy pryč. Pokud požadujete informace, nevybídejte paměť obsahující informace. Volání funkce, která vrací informace o paměti (například haldy), nemusí být použita s uvolněnou pamětí, protože mohou vracet nepravdá data.

Funkce HeapDestroy zničí objekt privátní haldy. Dekomituje a uvolní všechny stránky objektu haldy a zneplatní popisovač haldy haldy.

porovnání metod přidělování paměti