Delen via


Heap-functies

Elk proces heeft een standaard heap die door het systeem wordt geleverd. Toepassingen die frequente toewijzingen van de heap maken, kunnen de prestaties verbeteren met behulp van privé-heaps.

Een privé-heap is een blok van een of meer pagina's in de adresruimte van het aanroepende proces. Na het maken van de privé-heap gebruikt het proces functies zoals HeapAlloc en HeapFree om het geheugen in die heap te beheren.

De heap-functies kunnen ook worden gebruikt voor het beheren van geheugen in de standaard-heap van het proces, met behulp van de ingang die wordt geretourneerd door de GetProcessHeap--functie. Voor nieuwe toepassingen moeten de heap-functies worden gebruikt in plaats van de globale en lokale functies voor dit doel.

Er is geen verschil tussen geheugen dat is toegewezen vanuit een privé-heap en die is toegewezen met behulp van de andere geheugentoewijzingsfuncties. Zie de tabel in Memory Management Functionsvoor een volledige lijst met functies.

Notitie

Een thread moet heap-functies alleen aanroepen voor de standaard heap en privé-heaps van het proces die door de thread worden gemaakt en beheerd, met behulp van ingangen die worden geretourneerd door de GetProcessHeap- of HeapCreate--functie.

 

Met de functie HeapCreate wordt een privé heap-object gemaakt waaruit het aanroepende proces geheugenblokken kan toewijzen met behulp van de functie HeapAlloc. HeapCreate geeft zowel een initiële grootte als een maximale grootte voor de heap op. De initiële grootte bepaalt het aantal vastgelegde pagina's, lees-/schrijfpagina's die in eerste instantie zijn toegewezen voor de heap. De maximale grootte bepaalt het totale aantal gereserveerde pagina's. Deze pagina's maken een aaneengesloten blok in de virtuele adresruimte van een proces waarin de heap kan groeien. Extra pagina's worden automatisch doorgevoerd vanuit deze gereserveerde ruimte als aanvragen door HeapAlloc- de huidige grootte van vastgelegde pagina's overschrijden, ervan uitgaande dat de fysieke opslag voor deze pagina beschikbaar is. Zodra de pagina's zijn doorgevoerd, worden ze pas gedecommitteerd nadat het proces is beëindigd of totdat de heap wordt vernietigd door de HeapDestroy--functie aan te roepen.

Het geheugen van een privé heap-object is alleen toegankelijk voor het proces dat het heeft gemaakt. Als een DLL (Dynamic Link Library) een privé-heap maakt, gebeurt dit in de adresruimte van het proces dat de DLL wordt genoemd. Het is alleen toegankelijk voor dat proces.

De functie HeapAlloc wijst een opgegeven aantal bytes van een privé-heap toe en retourneert een aanwijzer naar het toegewezen blok. Deze aanwijzer kan worden gebruikt in de HeapFree, HeapReAlloc, HeapSizeen HeapValidate--functies.

Geheugen toegewezen door HeapAlloc is niet verplaatsbaar. Het adres dat door HeapAlloc wordt geretourneerd, is geldig totdat het geheugenblok is vrijgemaakt of opnieuw is toegewezen; het geheugenblok hoeft niet te worden vergrendeld.

Omdat het systeem een privé heap niet kan comprimeren, kan het worden gefragmenteerd. Toepassingen die grote hoeveelheden geheugen toewijzen in verschillende toewijzingsgrootten, kunnen gebruikmaken van de heap met weinig fragmentatie om heapfragmentatie te verminderen.

Een mogelijk gebruik voor de heap-functies is het maken van een privé-heap wanneer een proces wordt gestart, waarbij een eerste grootte wordt opgegeven die voldoende is om te voldoen aan de geheugenvereisten van het proces. Als de aanroep van de functie HeapCreate mislukt, kan het proces de gebruiker op de hoogte stellen van het geheugentekort; als dit lukt, is het proces echter verzekerd van het geheugen dat nodig is.

Geheugen aangevraagd door HeapCreate kan al dan niet aaneengesloten zijn. Geheugen toegewezen binnen een heap door HeapAlloc is aaneengesloten. Schrijf niet naar of lees vanuit het geheugen in een heap, behalve die is toegewezen door HeapAlloc, en u moet ook geen relatie aannemen tussen twee gebieden geheugen die zijn toegewezen door HeapAlloc-.

U mag niet verwijzen naar geheugen dat is vrijgemaakt door HeapFree. Nadat het geheugen is vrijgemaakt, is alle informatie die in het geheugen is opgenomen, voor altijd verdwenen. Als u informatie nodig hebt, kunt u geen geheugen vrij maken met de informatie. Functieaanroepen die informatie over geheugen retourneren (zoals HeapSize) worden mogelijk niet gebruikt met vrij geheugen, omdat ze valse gegevens kunnen retourneren.

De HeapDestroy functie vernietigt een privé heap-object. Hiermee worden alle pagina's van het heap-object gedecommitt en vrijgegeven en wordt de ingang ongeldig gemaakt voor de heap.

geheugentoewijzingsmethoden vergelijken