HeapValidate

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

function HeapValidate(
  hHeap: THandle;  // дескриптор кучи
  dwFlags: DWORD;  // опции доступа к куче
  lpMem: Pointer   // опционально зависимый указатель на блок
): BOOL; stdcall;

Параметры

[in]
Дескриптор интересующей нас кучи. Функция HeapValidate осуществит проверку этой кучи, или указанного фрагмента памяти, принадлежащего этой куче.

dwFlags [in]
Указывает доступ к куче во время выполнения операции. Может принимать слудующее значение:

Флаг Назначение

HEAP_NO_SERIALIZE1)

Указывает на то, что во время выполнения функции HeapValidate к куче не будут происходить обращения из других потоков.

lpMem [in]
Указывает на фрагмент памяти, принадлежащий куче, проверку которого мы будем производить. Этот параметр может также принимать значение nil. В этом случае будет осуществлена проверка всей кучи, заданной параметром hHeap. Если же этот параметр не равен nil, то будет осуществлена проверка только указанного фрагмента памяти без проверки остатка кучи.

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

В случае, если куча или указанный блок памяти не являются поврежденными, возвращает значение True.

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

Описание

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

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

Если вы хотите произвести проверку для элементов кучи, которые были получены в результате вызова функции HeapWalk, то вы должны выполнять вызов HeapValidate только для тех элементов, для которых установлен флаг PROCESS_HEAP_ENTRY_BUSY в структуре TProcessHeapEntry. Функция HeapValidate вернет значение False для всех элеентов, для которых этот флаг сброшен.

Защита от повторной входимости гарантирует, что в том случае, когда к куче будет происходить одновременно обращение из двух или нескольких потоков (например, один будет выделять память, а другой будет ее освобождать), работа с кучей будет происходить корректно. Тем не менее защита от повторной входимости требует некоторых затрат ресурсов, поэтому вы должны использовать ее только в том случае, когда несколько потоков одновременно обращаются к куче. Задавая флаг HEAP_NO_SERIALIZE, вы можете отключить защиту от повторной входимости. Одновременное обращение к куче из двух или нескольких потоков, при отключенной защите от повторной входимости, может повлечь за собой разрушение кучи. Поэтому вы должны отключать защиту от посторной входимости только в одном из следующих случаев:

  • В процессе существует только один поток.
  • В процессе существует несколько потоков, но доступ к указанной куче осуществляется только из одного потока.
  • В процессу существует несколько потоков, но приложение обеспечивает свои собственные механизмы защиты от повторной входимости.
  • Примечание: для того, чтобы уберечь себя от ошибки нарушения доступа (access violation), вы должны защитить блоками структурной обработки исключений любой код, выполняющий операции чтения/записи в кучу. Для большей информации по этому вопросу смотрите раздел "Структурная обработка исключений".

    Требования

    Windows NT/2000: Требуется Windows NT 3.5
    Windows 95/98: Не поддерживается
    Бибиотека: Kernel32.dll
    Подключаемый модуль: Windows

    Смотри также:

  • виртуальная память,
  • работа с кучей,
  • описание кучи,
  • список функций для работы с кучей,
  • HeapCreate,
  • HeapWalk,
  • TProcessHeapEntry
  • НазадHeapUnlock HeapWalkВперед

    © Mystic, 2002