다음을 통해 공유


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 할당된 메모리가 0으로 초기화됩니다. 그렇지 않으면 메모리가 0으로 초기화되지 않습니다.

[in] Size

할당할 바이트 수입니다. HeapHandle 매개 변수로 지정된 힙이 공진 가능한 힙인 경우 크기 힙의 가상 메모리 임계값보다 작거나 같아야 합니다. (자세한 내용은 Parameters 매개 변수의 VirtualMemoryThreshold 멤버를 참조하여 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

RtlDestroyHeap

RtlFreeHeap