Compartir a través de


Función RtlAllocateHeap (ntifs.h)

La rutina RtlAllocateHeap asigna un bloque de memoria de un montón.

Sintaxis

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

Parámetros

[in] HeapHandle

Identificador de un montón privado desde el que se asignará la memoria. Este parámetro es un identificador devuelto de una llamada correcta a RtlCreateHeap .

[in, optional] Flags

Aspectos controlables de la asignación del montón. Al especificar cualquiera de estos valores, se invalidará el valor correspondiente especificado cuando se creó el montón con RtlCreateHeap. Este parámetro puede ser uno o más de los siguientes valores.

Marca Significado
HEAP_GENERATE_EXCEPTIONS El sistema generará una excepción para indicar un error de función, como una condición de memoria insuficiente, en lugar de devolver NULL.
HEAP_NO_SERIALIZE La exclusión mutua no se usará mientras RtlAllocateHeap tiene acceso al montón.
HEAP_ZERO_MEMORY La memoria asignada se inicializará en cero. De lo contrario, la memoria no se inicializa en cero.

[in] Size

Número de bytes que se van a asignar. Si el montón, especificado por el parámetro HeapHandle , es un montón no crecimiento, Size debe ser menor o igual que el umbral de memoria virtual del montón. (Para obtener más información, vea el miembro VirtualMemoryThreshold del parámetro Parameters en RtlCreateHeap).

Valor devuelto

Si la llamada a RtlAllocateHeap se realiza correctamente, el valor devuelto es un puntero al bloque recién asignado. El valor devuelto es NULL si se produjo un error en la asignación.

Comentarios

RtlAllocateHeap asigna un bloque de memoria del tamaño especificado del montón especificado.

Para liberar un bloque de memoria asignado por RtlAllocateHeap, llame a RtlFreeHeap.

La memoria asignada por RtlAllocateHeap no es extraíble. Puesto que la memoria no es extraíble, es posible que el montón se fragmente.

La serialización garantiza la exclusión mutua cuando dos o más subprocesos intentan asignar o liberar bloques simultáneamente del mismo montón. Hay un pequeño costo de rendimiento para la serialización, pero debe usarse siempre que varios subprocesos asignen y liberen memoria del mismo montón. Establecer el valor de HEAP_NO_SERIALIZE elimina la exclusión mutua en el montón. Sin serialización, dos o más subprocesos que usan el mismo identificador de montón podrían intentar asignar o liberar memoria simultáneamente, lo que probablemente causaría daños en el montón. Por lo tanto, el valor de HEAP_NO_SERIALIZE solo se puede usar de forma segura en las situaciones siguientes:

  • El proceso solo tiene un subproceso.

  • El proceso tiene varios subprocesos, pero solo un subproceso llama a las funciones del montón para un montón específico.

  • El proceso tiene varios subprocesos y la aplicación proporciona su propio mecanismo para la exclusión mutua a un montón específico.

Nota

Para protegerse contra una infracción de acceso, use el control estructurado de excepciones para proteger cualquier código que escriba o lea desde un montón. Para obtener más información sobre el control estructurado de excepciones con accesos a memoria, consulte Control de excepciones.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP
Plataforma de destino Universal
Encabezado ntifs.h (incluya Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Consulte también

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap