Condividi tramite


Funzioni heap

Ogni processo ha un heap predefinito fornito dal sistema. Le applicazioni che effettuano allocazioni frequenti dall'heap possono migliorare le prestazioni usando heap 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 predefinito del processo, usando l'handle restituito dalla funzione GetProcessHeap. Le nuove applicazioni devono usare le funzioni heap anziché le funzioni globali e locali a 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 delle funzioni, vedere la tabella in Funzioni di gestione della memoria.

Nota

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

 

La funzione HeapCreate crea un oggetto heap privato da cui il processo chiamante può allocare blocchi di memoria usando la funzione HeapAlloc. HeapCreare specifica sia una dimensione iniziale che una dimensione massima per l'heap. Le dimensioni iniziali determinano il numero di pagine di cui è stato eseguito il commit, 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. Il commit automatico di pagine aggiuntive viene eseguito da questo spazio riservato se le richieste da HeapAlloc superano le dimensioni correnti delle pagine di cui è stato eseguito il commit, presupponendo che sia disponibile l'archiviazione fisica. Una volta eseguito il commit delle pagine, non vengono decommessi finché il processo non viene terminato o finché l'heap non viene eliminato definitivamente chiamando la funzione HeapDestroy.

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

La funzioneheapAllocalloca un numero specificato di byte da un heap privato e restituisce un puntatore al blocco allocato. Questo puntatore può essere usato nelleHeapFree, HeapReAlloc, HeapSizee HeapValidate.

La memoria allocata da HeapAlloc non è mobile. 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 bassa frammentazione per ridurre la frammentazione dell'heap.

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

Memoria richiesta da HeapCreare può essere o meno contigua. La memoria allocata all'interno di un heap da heapAlloc è contigua. Non è consigliabile scrivere o leggere dalla memoria in un heap, ad eccezione del fatto che allocato da HeapAlloc, né si presuppone alcuna relazione tra due aree di memoria allocate da HeapAlloc.

Non è consigliabile fare riferimento in alcun modo alla memoria liberata da HeapFree. Dopo che la memoria viene liberata, 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, perché potrebbero restituire dati falsi.

La funzioneheapDestroyelimina definitivamente un oggetto heap privato. Decommette e rilascia tutte le pagine dell'oggetto heap e invalida l'handle nell'heap.

confronto dei metodi di allocazione della memoria