Поделиться через


Функция HeapValidate (heapapi.h)

Проверяет указанную кучу. Функция проверяет все блоки памяти в куче и проверяет, что структуры управления кучи, поддерживаемые диспетчером кучи, находятся в согласованном состоянии. Функцию HeapValidate также можно использовать для проверки одного блока памяти в указанной куче без проверки допустимости всей кучи.

Синтаксис

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

Параметры

[in] hHeap

Дескриптор кучи для проверки. Этот дескриптор возвращается функцией HeapCreate или GetProcessHeap .

[in] dwFlags

Параметры доступа к куче. Этот параметр может иметь следующее значение.

Значение Значение
HEAP_NO_SERIALIZE
0x00000001
Сериализованный доступ не будет использоваться. Дополнительные сведения см. в подразделе "Примечания".

Чтобы убедиться, что сериализованный доступ отключен для всех вызовов этой функции, укажите HEAP_NO_SERIALIZE в вызове HeapCreate. В этом случае необязательно дополнительно указывать HEAP_NO_SERIALIZE в вызове функции.

Это значение не следует указывать при доступе к куче процесса по умолчанию. Система может создавать дополнительные потоки в процессе приложения, такие как обработчик CTRL+C, которые одновременно обращаются к куче процесса по умолчанию.

[in, optional] lpMem

Указатель на блок памяти в указанной куче. Этот параметр может иметь значение NULL.

Если этот параметр имеет значение NULL, функция пытается проверить всю кучу, заданную параметром hHeap.

Если этот параметр не имеет значение NULL, функция пытается проверить блок памяти, на который указывает lpMem. Он не пытается проверить остальную часть кучи.

Возвращаемое значение

Если указанная куча или блок памяти допустимы, возвращается ненулевое значение.

Если указанная куча или блок памяти недопустимы, возвращаемое значение равно нулю. В системе, настроенной для отладки, функция HeapValidate затем отображает сообщения отладки, описывающие часть кучи или блок памяти, которая является недопустимой, и останавливается в жестко заданной точке останова, чтобы вы могли проверить систему, чтобы определить источник недопустимости. Функция HeapValidate не задает значение последней ошибки потока. Для этой функции нет расширенных сведений об ошибке; не вызывать GetLastError.

Комментарии

Функция HeapValidate в первую очередь полезна для отладки, так как проверка потенциально занимает много времени. Проверка кучи может блокировать доступ других потоков к куче и может снизить производительность, особенно на симметричные многопроцессорные компьютеры (SMP). Эти побочные эффекты могут длиться до тех пор, пока не вернется HeapValidate .

Существуют структуры управления кучи для каждого блока памяти в куче и для кучи в целом. При использовании функции HeapValidate для проверки полной кучи она проверяет все эти структуры управления на согласованность.

При использовании HeapValidate для проверки одного блока памяти в куче проверяются только структуры управления, относящиеся к этому элементу. HeapValidate может проверять только выделенные блоки памяти. Вызов HeapValidate для освобожденного блока памяти возвращает значение FALSE , так как нет структур управления для проверки.

Если вы хотите проверить элементы кучи, перечисленные функцией HeapWalk , следует вызывать HeapValidate только для элементов, имеющих PROCESS_HEAP_ENTRY_BUSY в элементе wFlags структуры PROCESS_HEAP_ENTRY . HeapValidate возвращает значение FALSE для всех элементов кучи, для которых не задан этот бит.

Сериализация обеспечивает взаимное исключение, когда два или более потоков пытаются одновременно выделить или освободить блоки из одной кучи. Сериализация имеет небольшие затраты на производительность, но ее необходимо использовать всякий раз, когда несколько потоков выделяют и освобождают память из одной кучи. Установка значения HEAP_NO_SERIALIZE исключает взаимное исключение в куче. Без сериализации два или более потоков, использующих один и тот же дескриптор кучи, могут попытаться выделить или освободить память одновременно, что может привести к повреждению кучи. Таким образом, значение HEAP_NO_SERIALIZE можно безопасно использовать только в следующих ситуациях:

  • Процесс содержит только один поток.
  • Процесс содержит несколько потоков, но только один поток вызывает функции кучи для определенной кучи.
  • Процесс состоит из нескольких потоков, и приложение предоставляет собственный механизм для взаимного исключения из определенной кучи.

Требования

Требование Значение
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header heapapi.h (включая Windows.h)
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

Функции кучи

HeapCreate

HeapWalk

Функции управления памятью

PROCESS_HEAP_ENTRY