Compartir a través de


Función HeapCompact (heapapi.h)

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

Sintaxis

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

Parámetros

[in] hHeap

Identificador del montón. Este identificador lo devuelve la función HeapCreate o GetProcessHeap.

[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 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 se produce un error en la función, 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.

Observaciones

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 de HeapFree y la función HeapCompact devuelve el tamaño del bloque libre más grande del montón, pero no compacta el montón aún más. Si el Deshabilitar la fusión del montón en marca global libre se establece 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 HEAP_NO_SERIALIZE puede, por lo tanto, usarse de forma segura solo en las siguientes situaciones:

  • 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.

Requisitos

Requisito Valor
cliente mínimo admitido Windows XP [aplicaciones de escritorio | Aplicaciones para UWP]
servidor mínimo admitido Windows Server 2003 [aplicaciones de escritorio | Aplicaciones para UWP]
de la plataforma de destino de Windows
encabezado de heapapi.h (incluya Windows.h)
biblioteca de Kernel32.lib
DLL de Kernel32.dll

Consulte también

funciones del montón de

MontónCrear

heapValidate de

funciones de administración de memoria

API de Vertdll disponibles en enclaves de VBS