Dela via


Heap Functions

Varje process har en standardhög som tillhandahålls av systemet. Program som gör frekventa allokeringar från heapen kan förbättra prestanda med hjälp av privata heaps.

En privat heap är ett block på en eller flera sidor i adressutrymmet för samtalsprocessen. När du har skapat den privata heapen använder processen funktioner som HeapAlloc och HeapFree- för att hantera minnet i heapen.

Heap-funktionerna kan också användas för att hantera minne i processens standard-heap, med hjälp av referensen som returneras av funktionen GetProcessHeap. Nya program bör använda heap-funktionerna i stället för globala och lokala funktioner för detta ändamål.

Det finns ingen skillnad mellan minne som allokeras från en privat heap och som allokeras med hjälp av de andra minnesallokeringsfunktionerna. En fullständig lista över funktioner finns i tabellen i Minneshanteringsfunktioner.

Not

En tråd ska anropa heap-funktioner endast för processens standard heap och privata heaps som tråden skapar och hanterar, med hjälp av referenser som returneras av funktionen GetProcessHeap eller HeapCreate.

 

Funktionen HeapCreate skapar ett privat heap-objekt från vilket anropsprocessen kan allokera minnesblock med hjälp av funktionen HeapAlloc. HeapCreate anger både en ursprunglig storlek och en maximal storlek för heapen. Den ursprungliga storleken avgör antalet bekräftade, lästa/skrivbara sidor som ursprungligen allokerats för heapen. Den maximala storleken avgör det totala antalet reserverade sidor. Dessa sidor skapar ett sammanhängande block i det virtuella adressutrymmet i en process där heapen kan växa. Ytterligare sidor checkas automatiskt in från det här reserverade utrymmet om begäranden från HeapAlloc överskrider den aktuella storleken på de bekräftade sidorna, förutsatt att den fysiska lagringen för den är tillgänglig. När sidorna har checkats in avbryts de inte förrän processen har avslutats eller tills heapen förstörs genom att anropa funktionen HeapDestroy.

Minnet av ett privat heap-objekt är endast tillgängligt för den process som skapade det. Om ett DLL-bibliotek (Dynamic Link Library) skapar en privat heap gör det i adressutrymmet för den process som kallade DLL. Den är endast tillgänglig för den processen.

Funktionen HeapAlloc allokerar ett angivet antal byte från en privat heap och returnerar en pekare till det allokerade blocket. Den här pekaren kan användas i funktionerna HeapFree, HeapReAlloc, HeapSizeoch HeapValidate.

Minne som allokerats av HeapAlloc kan inte flyttas. Adressen som returneras av HeapAlloc är giltig tills minnesblocket frigörs eller omallokeras. minnesblocket behöver inte vara låst.

Eftersom systemet inte kan komprimera en privat heap kan det bli fragmenterat. Program som allokerar stora mängder minne i olika allokeringsstorlekar kan använda heap med låg fragmentering för att minska fragmenteringen av heapen.

En möjlig användning för heapfunktionerna är att skapa en privat heap när en process startas, vilket anger en initial storlek som är tillräcklig för att uppfylla minneskraven för processen. Om anropet till funktionen HeapCreate misslyckas kan processen avsluta eller meddela användaren om minnesbristen. Om det lyckas är processen dock säker på att ha det minne den behöver.

Minne som begärs av HeapSkapa kan vara sammanhängande eller inte. Minnet som allokeras i en hög av HeapAlloc är sammanhängande. Du bör inte skriva till eller läsa från minnet i en heap förutom det som allokerats av HeapAlloc, och du bör inte heller anta någon relation mellan två minnesområden som allokerats av HeapAlloc.

Du bör inte på något sätt referera till minne som har frigjorts av HeapFree. När minnet har frigjorts är all information som kan ha funnits i det borta för alltid. Om du behöver information ska du inte frigöra minne som innehåller informationen. Funktionsanrop som returnerar information om minne (till exempel HeapSize) kanske inte används med ledigt minne, eftersom de kan returnera falska data.

Funktionen HeapDestroy förstör ett privat heapobjekt. Det tar bort och släpper alla sidor i heap-objektet, och det ogiltigförklarar handtaget till heapen.

jämföra metoder för minnesallokering