Функция 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 |