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 매개 변수에서 RtlCreateHeap에 대한 VirtualMemoryThreshold 멤버를 참조하세요.

반환 값

RtlAllocateHeap에 대한 호출이 성공하면 반환 값은 새로 할당된 블록에 대한 포인터입니다. 할당에 실패한 경우 반환 값은 NULL입니다.

설명

RtlAllocateHeap 은 지정된 힙에서 지정된 크기의 메모리 블록을 할당합니다.

RtlAllocateHeap에 의해 할당된 메모리 블록을 해제하려면 RtlFreeHeap을 호출합니다.

RtlAllocateHeap에서 할당한 메모리는 움직일 수 없습니다. 메모리를 움직일 수 없으므로 힙이 조각화될 수 있습니다.

직렬화는 둘 이상의 스레드가 동일한 힙에서 블록을 동시에 할당하거나 해제하려고 할 때 상호 제외를 보장합니다. serialization에는 약간의 성능 비용이 있지만 여러 스레드가 동일한 힙에서 메모리를 할당하고 해제할 때마다 사용해야 합니다. HEAP_NO_SERIALIZE 값을 설정하면 힙에서 상호 제외가 제거됩니다. 직렬화가 없으면 동일한 힙 핸들을 사용하는 두 개 이상의 스레드가 동시에 메모리를 할당하거나 해제하려고 시도할 수 있으며, 이로 인해 힙이 손상될 수 있습니다. 따라서 HEAP_NO_SERIALIZE 값은 다음과 같은 상황에서만 안전하게 사용할 수 있습니다.

  • 프로세스에는 스레드가 하나만 있습니다.

  • 프로세스에는 여러 스레드가 있지만 한 스레드만 특정 힙에 대한 힙 함수를 호출합니다.

  • 프로세스에는 여러 스레드가 있으며 애플리케이션은 특정 힙에 대한 상호 배제를 위한 고유한 메커니즘을 제공합니다.

참고

액세스 위반을 방지하려면 구조적 예외 처리를 사용하여 힙에 쓰거나 읽는 코드를 보호합니다. 메모리 액세스를 사용하는 구조적 예외 처리에 대한 자세한 내용은 예외 처리를 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP
대상 플랫폼 유니버설
헤더 ntifs.h(Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

추가 정보

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap