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


Функция 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. Этот параметр может быть одним или несколькими из следующих значений.

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

[in] Size

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

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

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

Замечания

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

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

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

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

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

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

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

Заметка

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP
целевая платформа Всеобщий
заголовка ntifs.h (include Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

См. также

RtlCreateHeap

RtlDeskHeap

RtlFreeHeap