Funzioni heap

Ogni processo ha un heap predefinito fornito dal sistema. Le applicazioni che effettuano allocazioni frequenti dall'heap possono migliorare le prestazioni usando heaps privati.

Un heap privato è un blocco di una o più pagine nello spazio indirizzi del processo chiamante. Dopo aver creato l'heap privato, il processo usa funzioni come HeapAlloc e HeapFree per gestire la memoria in tale heap .

Le funzioni heap possono essere usate anche per gestire la memoria nell'heap predefinita del processo, usando l'handle restituito dalla funzione GetProcessHeap . Le nuove applicazioni devono usare le funzioni heap anziché le funzioni globali e locali per questo scopo.

Non esiste alcuna differenza tra la memoria allocata da un heap privato e quella allocata usando le altre funzioni di allocazione della memoria. Per un elenco completo di funzioni, vedere la tabella in Funzioni di gestione della memoria.

Nota

Un thread deve chiamare funzioni heap solo per l'heap predefinito del processo e gli heaps privati creati e gestiti dal thread, usando handle restituiti dalla funzione GetProcessHeap o HeapCreate .

 

La funzione HeapCreate crea un oggetto heap privato da cui il processo chiamante può allocare blocchi di memoria usando la funzione HeapAlloc . HeapCreate specifica sia una dimensione iniziale che una dimensione massima per l'heap. Le dimensioni iniziali determinano il numero di pagine di lettura/scrittura inizialmente allocate per l'heap. La dimensione massima determina il numero totale di pagine riservate. Queste pagine creano un blocco contiguo nello spazio indirizzi virtuale di un processo in cui l'heap può crescere. Le pagine aggiuntive vengono eseguite automaticamente da questo spazio riservato se le richieste da HeapAlloc superano le dimensioni correnti delle pagine di commit, presupponendo che l'archiviazione fisica per essa sia disponibile. Dopo il commit delle pagine, non vengono decommessi finché il processo non viene terminato o finché l'heap non viene distrutto chiamando la funzione HeapDestroy .

La memoria di un oggetto heap privato è accessibile solo al processo creato. Se una libreria di collegamento dinamico (DLL) crea un heap privato, lo fa nello spazio degli indirizzi del processo che ha chiamato dll. È accessibile solo a tale processo.

La funzione HeapAlloc alloca un numero specificato di byte da un heap privato e restituisce un puntatore al blocco allocato. Questo puntatore può essere usato nelle funzioni HeapFree, HeapReAlloc, HeapSize e HeapValidate.

La memoria allocata da HeapAlloc non è rimovibile. L'indirizzo restituito da HeapAlloc è valido fino a quando il blocco di memoria non viene liberato o riallocato; il blocco di memoria non deve essere bloccato.

Poiché il sistema non può compattare un heap privato, può diventare frammentato. Le applicazioni che allocano grandi quantità di memoria in varie dimensioni di allocazione possono usare l'heap a frammentazione bassa per ridurre la frammentazione dell'heap .

Un possibile uso per le funzioni heap consiste nel creare un heap privato quando un processo viene avviato, specificando una dimensione iniziale sufficiente per soddisfare i requisiti di memoria del processo. Se la chiamata alla funzione HeapCreate ha esito negativo, il processo può terminare o notificare all'utente la carenza di memoria; se ha esito positivo, tuttavia, il processo è assicurato di avere la memoria necessaria.

La memoria richiesta da HeapCreate può o non essere contigua. La memoria allocata all'interno di un heap di HeapAlloc è contigua. Non è consigliabile scrivere o leggere dalla memoria in un heap, ad eccezione del fatto che allocato da HeapAlloc, né è consigliabile presupporre alcuna relazione tra due aree di memoria allocata da HeapAlloc.

Non è consigliabile fare riferimento in alcun modo alla memoria liberata da HeapFree. Dopo aver liberato la memoria, tutte le informazioni che potrebbero essere state in esso sono andate per sempre. Se sono necessarie informazioni, non liberare memoria contenente le informazioni. Le chiamate di funzione che restituiscono informazioni sulla memoria (ad esempio HeapSize) potrebbero non essere usate con memoria liberata, in quanto potrebbero restituire dati fittizi.

La funzione HeapDestroy elimina un oggetto heap privato. Decommits e rilascia tutte le pagine dell'oggetto heap e invalida l'handle nell'heap.

Confronto dei metodi di allocazione della memoria