HeapSize

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

function HeapSize(
  hHeap: THandle;   // дескриптор кучи
  dwFlags: DWORD;   // опции получения размера
  lpMem: Pointer    // указатель на фрагмент памяти
): DWORD; stdcall;

Параметры

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

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

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

HEAP_NO_SERIALIZE1)

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

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

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

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

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

В случае ошибки функция возвращает -1.

Важно! В случае возникновения ошибки приложение НЕ ДОЛЖНО производить вызов SetLastError. Приложение также не должно производить вызов GetLastError для получения расширенной информации об ошибке. Это, вероятно, связано с тем, что функции GetLastError и SetLastError сами используют кучу процесса.

Описание

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

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

    Требования

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

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

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

    © Mystic, 2002