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


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

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

Синтаксис

SIZE_T HeapCompact(
  [in] HANDLE hHeap,
  [in] DWORD  dwFlags
);

Параметры

[in] hHeap

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

[in] dwFlags

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

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

Дополнительные сведения см. в разделе "Примечания".

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

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

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

Если функция выполнена успешно, возвращаемое значение — это размер крупнейшего зафиксированного свободного блока в куче в байтах.

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

В маловероятном случае, что в куче нет места, возвращаемое значение функции равно нулю, и GetLastError возвращает значение NO_ERROR.

Замечания

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

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

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

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [классические приложения | Приложения UWP]
минимальный поддерживаемый сервер Windows Server 2003 [классические приложения | Приложения UWP]
целевая платформа Виндоус
заголовка heapapi.h (включая Windows.h)
библиотеки Kernel32.lib
DLL Kernel32.dll

См. также

функции кучи

HeapCreate

ХеапValidate

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

API Vertdll, доступные в анклавах VBS