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

Identificador 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. A especificação de qualquer um desses valores substituirá o valor correspondente especificado quando o heap tiver sido criado com RtlCreateHeap. Esse parâmetro pode ser um ou mais dos valores a seguir.

Sinalizador Significado
HEAP_GENERATE_EXCEPTIONS O sistema irá gerar uma exceção para indicar uma falha de função, como uma condição de memória insuficiente, em vez de retornar NULL.
HEAP_NO_SERIALIZE A exclusão mútua não será usada enquanto o 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-Grow, o tamanho 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.)

Valor retornado

Se a chamada para RtlAllocateHeap tiver sucesso, o valor de retorno será um ponteiro para o bloco recém alocado. O valor de retorno será nulo se a alocação falhar.

Comentários

RtlAllocateHeap aloca um bloco de memória do tamanho especificado a partir 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 se torne fragmentado.

A serialização garante a exclusão mútua quando dois ou mais threads tentam alocar ou liberar blocos simultaneamente do mesmo heap. Há um pequeno custo de desempenho para serialização, mas ele deve ser usado sempre que vários threads alocarem e liberarem memória do mesmo heap. Definir o HEAP_NO_SERIALIZE valor 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 de 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 em um heap específico.

Observação

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

Requisitos

   
Cliente mínimo com suporte essa rotina está disponível no Microsoft Windows XP e versões posteriores.
Plataforma de Destino Universal
Cabeçalho ntifs. h (incluir Ntifs. h)
Biblioteca NtosKrnl. lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Confira também

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap