Функция RtlAllocateHeap (ntifs.h)

Подпрограмма RtlAllocateHeap выделяет блок памяти из кучи.

Синтаксис

NTSYSAPI PVOID RtlAllocateHeap(
  [in]           PVOID  HeapHandle,
  [in, optional] ULONG  Flags,
  [in]           SIZE_T Size
);

Параметры

[in] HeapHandle

Дескриптор частной кучи, из которой будет выделена память. Этот параметр представляет собой дескриптор, возвращенный при успешном вызове RtlCreateHeap .

[in, optional] Flags

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

Flag Значение
HEAP_GENERATE_EXCEPTIONS Система вызовет исключение, указывающее на сбой функции, например состояние нехватки памяти, вместо того чтобы возвращать значение NULL.
HEAP_NO_SERIALIZE Взаимное исключение не будет использоваться, пока RtlAllocateHeap обращается к куче.
HEAP_ZERO_MEMORY Выделенная память будет инициализирована нулевым значением. В противном случае память не инициализируется до нуля.

[in] Size

Число выделенных байтов. Если куча, указанная параметром HeapHandle , является неустранимой кучей, размер должен быть меньше порогового значения виртуальной памяти кучи или быть равным ей. (Дополнительные сведения см. в разделе Элемент VirtualMemoryThreshold параметра Parameters для параметра RtlCreateHeap.)

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

Если вызов RtlAllocateHeap завершается успешно, возвращаемое значение является указателем на только что выделенный блок. Если выделение не удалось, возвращаемое значение равно NULL.

Комментарии

RtlAllocateHeap выделяет блок памяти указанного размера из указанной кучи.

Чтобы освободить блок памяти, выделенный RtlAllocateHeap, вызовите RtlFreeHeap.

Память, выделенная RtlAllocateHeap , не перемещается. Так как память не перемещается, кучи может стать фрагментаной.

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

  • Процесс содержит только один поток.

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

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

Примечание

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

Требования

Требование Значение
Минимальная версия клиента Windows XP
Целевая платформа Универсальное
Верхняя часть ntifs.h (включая Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

См. также раздел

RtlCreateHeap

RtlDe определенияheap

RtlFreeHeap