Share via


Función HeapValidate (heapapi.h)

Valida el montón especificado. La función examina todos los bloques de memoria del montón y comprueba que las estructuras de control del montón mantenidas por el administrador del montón están en un estado coherente. También puede usar la función HeapValidate para validar un único bloque de memoria dentro de un montón especificado sin comprobar la validez de todo el montón.

Sintaxis

BOOL HeapValidate(
  [in]           HANDLE  hHeap,
  [in]           DWORD   dwFlags,
  [in, optional] LPCVOID lpMem
);

Parámetros

[in] hHeap

Identificador del montón que se va a validar. 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 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.

Este valor no se debe especificar al acceder al montón predeterminado del proceso. 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 predeterminado del proceso.

[in, optional] lpMem

Puntero a un bloque de memoria dentro del montón especificado. Este parámetro puede ser NULL.

Si este parámetro es NULL, la función intenta validar todo el montón especificado por hHeap.

Si este parámetro no es NULL, la función intenta validar el bloque de memoria al que apunta lpMem. No intenta validar el resto del montón.

Valor devuelto

Si el montón o bloque de memoria especificado es válido, el valor devuelto es distinto de cero.

Si el montón o bloque de memoria especificado no es válido, el valor devuelto es cero. En una configuración del sistema para la depuración, la función HeapValidate muestra los mensajes de depuración que describen la parte del montón o bloque de memoria que no es válido y se detiene en un punto de interrupción codificado de forma rígida para que pueda examinar el sistema para determinar el origen de la invalididad. La función HeapValidate no establece el último valor de error del subproceso. No hay información de error extendida para esta función; no llame a GetLastError.

Comentarios

La función HeapValidate es principalmente útil para la depuración, ya que la validación puede llevar mucho tiempo. La validación de un montón puede impedir que otros subprocesos accedan al montón y pueden degradar el rendimiento, especialmente en equipos de multiprocesamiento simétrico (SMP). Estos efectos secundarios pueden durar hasta que Se devuelve HeapValidate .

Hay estructuras de control de montón para cada bloque de memoria en un montón y para el montón en su conjunto. Cuando se usa la función HeapValidate para validar un montón completo, comprueba si todas estas estructuras de control son coherentes.

Cuando se usa HeapValidate para validar un único bloque de memoria dentro de un montón, comprueba solo las estructuras de control que pertenecen a ese elemento. HeapValidate solo puede validar bloques de memoria asignados. Al llamar a HeapValidate en un bloque de memoria liberado, se devolverá FALSE porque no hay estructuras de control para validar.

Si desea validar los elementos del montón enumerados por la función HeapWalk , solo debe llamar a HeapValidate en los elementos que tienen PROCESS_HEAP_ENTRY_BUSY en el miembro wFlags de la estructura PROCESS_HEAP_ENTRY . HeapValidate devuelve FALSE para todos los elementos del montón que no tienen este conjunto de bits.

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.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado heapapi.h (incluye Windows.h)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

Funciones del montón

MontónCrear

HeapWalk

Funciones de administración de memoria

PROCESS_HEAP_ENTRY