HeapFree

Фунция HeapFree освобождает фрагмент памяти, который был ранее выделен из кучи при помощи одного из вызовов HeapAlloc или HeapReAlloc.

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

Параметры

hHeap [in]
Задает кучу, которая владеет освобождемым фрагментом памяти. Данный параметр должен быть дескриптором, полученным при помощи функций HeapCreate или GetProcessHeap.

dwFlags [in]
Указывает несколько управляющих аспектов при освобождении указанного блока памяти. Указание соответствующих значений переопределяет значения, которые были указаны при создании кучи (вызов HeapCreate, параметр flOptions).

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

HEAP_NO_SERIALIZE1)

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

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

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

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

В случае удачного звершения функция возвращает True.

В случае ошибки функция вернет False. Для получения расширенной информации об ошибке следует сделать вызов GetLastError.

Описание

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

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

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

    Требования

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

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

  • виртуальная память,
  • работа с кучей,
  • описание кучи,
  • список функций для работы с кучей,
  • GetProcessHeap,
  • HeapAlloc,
  • HeapCreate,
  • HeapDestroy,
  • HeapReAlloc,
  • HeapSize,
  • SetLastError
  • НазадHeapDestroy HeapLockВперед

    © Mystic, 2002