HeapCompact

Функция HeapCompact позволяет сжать содержимое кучи. Куча сжимается за счет объединения двух соседних свободных блоков памяти и путем снятия физической памяти с больших свободных фрагментов.

function HeapCompact(
  hHeap: THandle;    // дескриптор кучи
  dwFlags: DWORD     // опции доступа к куче
): UINT; stdcall;

Параметры

hHeap [in]
Дескриптор кучи, которая будет сжата.

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

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

HEAP_NO_SERIALIZE1)

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

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

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

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

Существует неверояный случай, когда все пространство кучи окажется занятым. В этом случае функция CompactHeap возвратит нуль, а функция GetLastError возвратит значение NO_ERROR.

Описание

Не существует никакой гарантии, что приложение сможет успешно выделить блок памяти, которыей вернет функция HeapCompact. Другие потоки или пороговое значение выделяемого блока памяти могут воспрепятствовать такому выделению.

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

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

    Требования

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

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

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

    © Mystic, 2002