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, verrà eseguito l'override del valore corrispondente specificato al momento della creazione dell'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 non gestibile, Size deve essere minore o uguale alla soglia di memoria virtuale dell'heap. Per altre informazioni, vedere il membro VirtualMemoryThreshold del parametro Parameters per 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 è mobile. Poiché la memoria non è mobile, è possibile che l'heap diventi frammentato.

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

  • Il processo ha un solo thread.

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

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

Nota

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

Requisiti

   
Client minimo supportato Questa routine è disponibile in Microsoft Windows XP e versioni successive.
Piattaforma di destinazione Universale
Intestazione ntifs.h (includere Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Vedi anche

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap