HeapCreate

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

function HeapCreate(
  flOptions: DWORD;      // атрибуты, испоользуемые кучей при выделении памяти
  dwInitialSize: DWORD;  // начальный размер кучи
  dwMaximumSize: DWORD   // максимальный размер кучи
): THandle; stdcall;

Параметры

flOptions [in]
Указывает опции вновь созданной кучи. Эти опции будут учитываться в дяльнейшем при обращениях к вновь созданной куче (функции HeapAlloc, HeapFree, HeapReAlloc и HeapSize. Вы можете указать один или несколько следующих флагов:

Флаг Значение

HEAP_GENERATE_EXCEPTIONS1)

Указывает системе на то, что в случае возникновения ошибки необходимо генерировать исключительную ситуацию. Это будет происходить во всех случаях, когда функция выделения памяти должна была бы возвратить значение nil. Этот флаг не относится к самому вызову HeapCreate. Если куча не может быть создана, то исключительная ситуация при установленном флаге не генерируется, а просто возвращается значение 0.

HEAP_NO_SERIALIZE1)

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

dwInitialSize [in]
Указывает начальный размер кучи в байтах. Данное значение определяет, какое количество физической памяти будет выделено куче при ее создании. Данное значение округляется в сторону увеличения до ближайшего значения, кратного размеру страницы. Для того, чтобы узнать размер страницы на вашем компьютере, необходимо выполнить вызов функции GetSystemInfo.

dwMaximumSize [in]
Если значение этого параметра не равно нулю, то оно задает максимальный размер кучи в байтах. При вызове HeapCreate, это значение будет округлено вверх до ближайшего значения, кратного размеру страницы и будет произведено резервирование блока памяти полученного размера в виртуальном адресном пространстве процесса. Если при выполнении функций HeapAlloc и HeapReAlloc запрашиваемый размер превышает начальное количество физической памяти, которая была выделена при создании кучи (параметр dwInitialSize) то, система выделит новые страницы физической памяти, но при этом суммарный размер куи не может превысить значение dwMaximumSize.

Важно!

Если значение параметра dwMaximumSize отлично от нуля, но полученная куча не является "растущей" кучей, и существует ограничение на максимальный размер выделяемого блока, который всегда должен быть меньше $7FFF8. Функция выделения памяти для такой кучи автоматически вернет ошибку при попытке выделить блок памяти такого или большего размера.

Если значение параметра dwMaximumSize равно нулю, то полученная куча является "растущей". Для этой кучи ее общий размер ограничен только доступной памятью. Для такой кучи выделение блока памяти размером больше чем $7FFF8 уже автоматически не ведет к ошибке - система произведет вызов функции VirtualAlloc для того, чтобы болучить такой большой блок памяти. Приложения, которые могут выделять большие блоки памяти, всегда должны устанавливать значение параметра dwMaximumSize в нуль.

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

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

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

Описание

При создании кучи происходит создание в виртуальном адресном простаранстве вызывающего процесса скрытого объекта путем использования функции VirtalAlloc Начальный размер этого блока памяти определяется параметром dwInitialSize. Параметр dwMaximumSize определяет количество зарезервированных страниц. Эти страницы определяют блок памяти, соответсвующий созданной кучи, и внутри этого блока куча может расти. Если для удовлетворения очередного запроса куче не хватает памяти в страницах, которым соответствует фзическая память, то физическая память передается новым, ранее зарезервированным страницам, при условии, что запрашиваемая память физически существует.

Объект в виртульном адрксном пространстве, который соотсветствует куче, доступен только в том процессе, который создал эту кучу. Если динамически подсоединяемая библиотека (DLL) создает кучу, то память под нее располагается в адресном пространстве того процесса, который провел обращение к DLL, и доступна только из этого процесса.

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

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

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

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

    Требования

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

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

  • виртуальная память,
  • работа с кучей,
  • описание кучи,
  • список функций для работы с кучей,
  • GetProcessHeap,
  • GetProcessHeaps, GetSystemInfo,
  • HeapAlloc,
  • HeapDestroy,
  • HeapFree,
  • HeapReAlloc,
  • HeapSize,
  • HeapValidate,
  • VirtualAlloc
  • НазадHeapCompact HeapDestroyВперед

    © Mystic, 2002