Share via


Función HeapCompact (heapapi.h)

Devuelve el tamaño del bloque libre confirmado más grande del montón especificado. Si se establece la marca global Disable heap (Deshabilitar el montón) en la marca global gratuita, esta función también combina bloques libres de memoria adyacentes en el montón.

Sintaxis

SIZE_T HeapCompact(
  [in] HANDLE hHeap,
  [in] DWORD  dwFlags
);

Parámetros

[in] hHeap

Identificador del montón. La función HeapCreate o GetProcessHeap devuelve este identificador.

[in] dwFlags

Las opciones de acceso del montón. Este parámetro puede ser el siguiente valor.

Valor Significado
HEAP_NO_SERIALIZE
0x00000001
No se usará el acceso serializado.

Para obtener más información, vea la sección Comentarios.

Para asegurarse de que el acceso serializado está deshabilitado para todas las llamadas a esta función, especifique HEAP_NO_SERIALIZE en la llamada a HeapCreate. En este caso, no es necesario especificar además HEAP_NO_SERIALIZE en esta llamada de función.

No especifique este valor al acceder al montón de procesos. El sistema puede crear subprocesos adicionales dentro del proceso de la aplicación, como un controlador CTRL+C, que accede simultáneamente al montón del proceso.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es el tamaño del bloque libre confirmado más grande del montón, en bytes.

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

En el improbable caso de que no haya ningún espacio disponible en el montón, el valor devuelto de la función es cero y GetLastError devuelve el valor NO_ERROR.

Comentarios

La función HeapCompact es principalmente útil para la depuración. Normalmente, el sistema compacta el montón cada vez que se llama a la función HeapFree y la función HeapCompact devuelve el tamaño del bloque libre más grande del montón, pero no compacta aún más el montón. Si la marca global Disable heap (Deshabilitar el montón) se establece en la marca global libre durante la depuración, el sistema no compacta el montón y la llamada a la función HeapCompact compacta el montón. Para obtener más información sobre las marcas globales, consulte la documentación de GFlags .

No hay ninguna garantía de que una aplicación pueda asignar correctamente un bloque de memoria del tamaño devuelto por HeapCompact. Otros subprocesos o el umbral de confirmación podrían impedir dicha asignación.

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. 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. El valor de HEAP_NO_SERIALIZE puede, por lo tanto, usarse de forma segura solo 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.

Requisitos

Requisito Value
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

MontónCrear

HeapValidate

Funciones de administración de memoria

API de Vertdll disponibles en enclaves de VBS