Condividi tramite


Funzione RtlAllocateHeap (ntifs.h)

La routine RtlAllocateHeap alloca un blocco di memoria da un heap.

Sintassi

NTSYSAPI PVOID RtlAllocateHeap(
  [in]           PVOID  HeapHandle,
  [in, optional] ULONG  Flags,
  [in]           SIZE_T Size
);

Parametri

[in] HeapHandle

Handle per un heap privato da cui verrà allocata la memoria. Questo parametro è un handle restituito da una chiamata riuscita a RtlCreateHeap .

[in, optional] Flags

Aspetti controllabili dell'allocazione dell'heap. Se si specifica uno di questi valori, il valore corrispondente specificato quando è stato creato l'heap con RtlCreateHeap. Questo parametro può essere uno o più dei valori seguenti.

Contrassegno Significato
HEAP_GENERATE_EXCEPTIONS Il sistema genererà un'eccezione per indicare un errore di funzione, ad esempio una condizione di memoria insufficiente, anziché restituire NULL.
HEAP_NO_SERIALIZE L'esclusione reciproca non verrà usata mentre RtlAllocateHeap accede all'heap.
HEAP_ZERO_MEMORY La memoria allocata verrà inizializzata su zero. In caso contrario, la memoria non viene inizializzata su zero.

[in] Size

Numero di byte da allocare. Se l'heap, specificato dal parametro HeapHandle , è un heap nonrowable, le dimensioni devono essere inferiori o uguali alla soglia di memoria virtuale dell'heap. Per altre informazioni, vedere il membro VirtualMemoryThreshold del parametro Parameters su RtlCreateHeap.

Valore restituito

Se la chiamata a RtlAllocateHeap ha esito positivo, il valore restituito è un puntatore al blocco appena allocato. Il valore restituito è NULL se l'allocazione non è riuscita.

Commenti

RtlAllocateHeap alloca un blocco di memoria delle dimensioni specificate dall'heap specificato.

Per liberare un blocco di memoria allocato da RtlAllocateHeap, chiamare RtlFreeHeap.

La memoria allocata da RtlAllocateHeap non è rimovibile. Poiché la memoria non è rimovibile, è possibile che l'heap diventi frammentato.

La serializzazione garantisce l'esclusione reciproca quando due o più thread tentano di allocare o liberare contemporaneamente blocchi dallo stesso heap. È previsto un costo di prestazioni ridotto per la serializzazione, ma deve essere usato ogni volta che più thread allocano e liberano memoria dallo stesso heap. L'impostazione del valore HEAP_NO_SERIALIZE elimina l'esclusione reciproca nell'heap. Senza serializzazione, due o più thread che usano lo stesso handle heap potrebbero tentare di allocare o liberare memoria contemporaneamente, causando probabilmente danneggiamenti nell'heap. Il valore HEAP_NO_SERIALIZE può quindi essere usato in modo sicuro solo nelle situazioni seguenti:

  • Il processo ha un solo thread.

  • Il processo include più thread, ma solo un thread chiama le funzioni heap per un heap specifico.

  • Il processo include più thread e l'applicazione fornisce il proprio meccanismo per l'esclusione reciproca a un heap specifico.

Nota

Per proteggere una violazione di accesso, usare la gestione delle eccezioni strutturate per proteggere qualsiasi codice che scrive in o legge da un heap. Per altre informazioni sulla gestione delle eccezioni strutturate con gli accessi alla memoria, vedere Gestione delle eccezioni.

Requisiti

Requisito Valore
Client minimo supportato Windows XP
Piattaforma di destinazione Universale
Intestazione ntifs.h (include Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Vedi anche

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap