Función HeapCreate (heapapi.h)

Crea un objeto de montón privado que el proceso de llamada puede usar. La función reserva espacio en el espacio de direcciones virtuales del proceso y asigna almacenamiento físico para una parte inicial especificada de este bloque.

Sintaxis

HANDLE HeapCreate(
  [in] DWORD  flOptions,
  [in] SIZE_T dwInitialSize,
  [in] SIZE_T dwMaximumSize
);

Parámetros

[in] flOptions

Opciones de asignación del montón. Estas opciones afectan al acceso posterior al nuevo montón a través de llamadas a las funciones del montón. Este parámetro puede ser 0 o uno o varios de los valores siguientes.

Valor Significado
HEAP_CREATE_ENABLE_EXECUTE
0x00040000
Todos los bloques de memoria asignados desde este montón permiten la ejecución de código, si el hardware aplica la prevención de ejecución de datos. Use este montón de marcas en aplicaciones que ejecutan código desde el montón. Si no se especifica HEAP_CREATE_ENABLE_EXECUTE y una aplicación intenta ejecutar código desde una página protegida, la aplicación recibe una excepción con el código de estado STATUS_ACCESS_VIOLATION.
HEAP_GENERATE_EXCEPTIONS
0x00000004
El sistema genera una excepción para indicar un error (por ejemplo, una condición de memoria insuficiente) para las llamadas a HeapAlloc y HeapReAlloc en lugar de devolver NULL.
HEAP_NO_SERIALIZE
0x00000001
El acceso serializado no se usa cuando las funciones del montón acceden a este montón. Esta opción se aplica a todas las llamadas a funciones de montón posteriores. Como alternativa, puede especificar esta opción en llamadas de función de montón individuales.

El montón de fragmentación baja (LFH) no se puede habilitar para un montón creado con esta opción.

No se puede bloquear un montón creado con esta opción.

Para obtener más información sobre el acceso serializado, vea la sección Comentarios de este tema.

[in] dwInitialSize

Tamaño inicial del montón, en bytes. Este valor determina la cantidad inicial de memoria que se confirma para el montón. El valor se redondea hacia arriba hasta un múltiplo del tamaño de página del sistema. El valor debe ser menor que dwMaximumSize.

Si este parámetro es 0, la función confirma una página. Para determinar el tamaño de una página en el equipo host, use la función GetSystemInfo .

[in] dwMaximumSize

Tamaño máximo del montón, en bytes. La función HeapCreate redondea dwMaximumSize hasta un múltiplo del tamaño de página del sistema y, a continuación, reserva un bloque de ese tamaño en el espacio de direcciones virtuales del proceso para el montón. Si las solicitudes de asignación realizadas por las funciones HeapAlloc o HeapReAlloc superan el tamaño especificado por dwInitialSize, el sistema confirma páginas adicionales de memoria para el montón, hasta el tamaño máximo del montón.

Si dwMaximumSize no es cero, el tamaño del montón es fijo y no puede crecer más allá del tamaño máximo. Además, el bloque de memoria más grande que se puede asignar desde el montón es ligeramente inferior a 512 KB para un proceso de 32 bits y ligeramente inferior a 1024 KB para un proceso de 64 bits. Las solicitudes para asignar bloques más grandes producen un error, incluso si el tamaño máximo del montón es lo suficientemente grande como para contener el bloque.

Si dwMaximumSize es 0, el montón puede crecer en tamaño. El tamaño del montón solo está limitado por la memoria disponible. Las solicitudes para asignar bloques de memoria mayores que el límite de un montón de tamaño fijo no fallan automáticamente; en su lugar, el sistema llama a la función VirtualAlloc para obtener la memoria necesaria para bloques grandes. Las aplicaciones que necesitan asignar bloques de memoria grandes deben establecer dwMaximumSize en 0.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es un identificador del montón recién creado.

Si la función no se realiza correctamente, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.

Comentarios

La función HeapCreate crea un objeto de montón privado desde el que el proceso de llamada puede asignar bloques de memoria mediante la función HeapAlloc . El tamaño inicial determina el número de páginas confirmadas asignadas inicialmente para el montón. El tamaño máximo determina el número total de páginas reservadas. Estas páginas crean un bloque en el espacio de direcciones virtuales del proceso en el que el montón puede crecer. Si las solicitudes de HeapAlloc superan el tamaño actual de las páginas confirmadas, las páginas adicionales se confirman automáticamente desde este espacio reservado, si el almacenamiento físico está disponible.

Windows Server 2003 y Windows XP: De forma predeterminada, el montón privado recién creado es un montón estándar. Para habilitar el montón de fragmentación baja, llame a la función HeapSetInformation con un identificador al montón privado.

La memoria de un objeto de montón privado solo es accesible para el proceso que lo creó. Si una biblioteca de vínculos dinámicos (DLL) crea un montón privado, el montón se crea en el espacio de direcciones del proceso que llama al archivo DLL y solo es accesible para ese proceso.

El sistema usa memoria del montón privado para almacenar estructuras compatibles con el montón, por lo que no todo el tamaño del montón especificado está disponible para el proceso. Por ejemplo, si la función HeapAlloc solicita 64 kilobytes (K) desde un montón con un tamaño máximo de 64 K, la solicitud puede producir un error debido a la sobrecarga del sistema.

Si no se especifica HEAP_NO_SERIALIZE (el valor predeterminado simple), el montón serializa el acceso dentro del proceso de llamada. 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 se debe usar cada vez que varios subprocesos asignan y liberan memoria del mismo montón. Las funciones HeapLock y HeapUnlock se pueden usar para bloquear y permitir el acceso a un montón serializado.

Establecer 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 pueden intentar asignar o liberar memoria simultáneamente, lo que puede causar daños en el montón. Por lo tanto, 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 en un montón específico.

Si se llama a las funciones HeapLock y HeapUnlock en un montón creado con la marca de HEAP_NO_SERIALIZE , los resultados no se definen.

Para obtener un identificador para el montón predeterminado de un proceso, use la función GetProcessHeap . Para obtener identificadores del montón predeterminado y los montones privados que están activos para el proceso de llamada, use la función GetProcessHeaps .

Ejemplos

Enumeración de un montón

Requisitos

   
Cliente mínimo compatible Windows XP [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado heapapi.h (incluya Windows.h)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

Funciones del montón

HeapAlloc

MontónDestroy

HeapValidate

Funciones de administración de memoria

API de Vertdll disponibles en enclaves de VBS