Função RtlAllocateHeap (ntifs.h)

A rotina RtlAllocateHeap aloca um bloco de memória de um heap.

Sintaxe

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

Parâmetros

[in] HeapHandle

Manipule para um heap privado do qual a memória será alocada. Esse parâmetro é um identificador retornado de uma chamada bem-sucedida para RtlCreateHeap .

[in, optional] Flags

Aspectos controláveis da alocação de heap. Especificar qualquer um desses valores substituirá o valor correspondente especificado quando o heap foi criado com RtlCreateHeap. Esse parâmetro pode usar um dos valores a seguir.

Sinalizador Significado
HEAP_GENERATE_EXCEPTIONS O sistema gerará uma exceção para indicar uma falha de função, como uma condição fora da memória, em vez de retornar NULL.
HEAP_NO_SERIALIZE A exclusão mútua não será usada enquanto RtlAllocateHeap estiver acessando o heap.
HEAP_ZERO_MEMORY A memória alocada será inicializada como zero. Caso contrário, a memória não será inicializada como zero.

[in] Size

Número de bytes a serem alocados. Se o heap, especificado pelo parâmetro HeapHandle , for um heap não executável, Size deverá ser menor ou igual ao limite de memória virtual do heap. (Para obter mais informações, consulte o membro VirtualMemoryThreshold do parâmetro Parameters para RtlCreateHeap.)

Retornar valor

Se a chamada para RtlAllocateHeap for bem-sucedida, o valor retornado será um ponteiro para o bloco recém-alocado. O valor retornado será NULL se a alocação falhar.

Comentários

RtlAllocateHeap aloca um bloco de memória do tamanho especificado do heap especificado.

Para liberar um bloco de memória alocado por RtlAllocateHeap, chame RtlFreeHeap.

A memória alocada por RtlAllocateHeap não é móvel. Como a memória não é móvel, é possível que o heap fique fragmentado.

A serialização garante a exclusão mútua quando dois ou mais threads tentam alocar simultaneamente ou liberar blocos do mesmo heap. Há um pequeno custo de desempenho para serialização, mas ele deve ser usado sempre que vários threads alocam e liberam memória do mesmo heap. Definir o valor HEAP_NO_SERIALIZE elimina a exclusão mútua no heap. Sem serialização, dois ou mais threads que usam o mesmo identificador de heap podem tentar alocar ou liberar memória simultaneamente, provavelmente causando corrupção no heap. O valor HEAP_NO_SERIALIZE pode, portanto, ser usado com segurança apenas nas seguintes situações:

  • O processo tem apenas um thread.

  • O processo tem vários threads, mas apenas um thread chama as funções de heap para um heap específico.

  • O processo tem vários threads e o aplicativo fornece seu próprio mecanismo para exclusão mútua a um heap específico.

Observação

Para se proteger contra uma violação de acesso, use o tratamento de exceção estruturado para proteger qualquer código que grave ou leia de um heap. Para obter mais informações sobre o tratamento de exceções estruturadas com acessos de memória, consulte Tratamento de exceções.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows XP
Plataforma de Destino Universal
Cabeçalho ntifs.h (inclua Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Confira também

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap