메모리 할당 방법 비교

올바른 할당 방법 선택

다음 지침을 사용하여 시나리오에 적합한 메모리 할당 API를 선택합니다.

Scenario 권장 API Notes
범용 C++ 할당 new / std::make_unique / std::make_shared C++ 코드에 대한 기본 선택입니다. 내부적으로 CRT 힙을 사용합니다. RAII는 자동 정리를 보장합니다.
범용 C 할당 malloc / calloc / realloc C 코드의 기본 선택입니다. 플랫폼 간에 이식 가능합니다.
최대 1MB보다 크거나 페이지 수준 제어가 필요한 할당 VirtualAlloc 페이지 세분성(일반적으로 4KB)에 할당합니다. 특정 보호 특성(PAGE_READWRITEPAGE_EXECUTE_READ등)을 사용하여 큰 주소 범위, 보호 페이지 또는 메모리를 예약하는 데 사용합니다.
사용자 지정 컨트롤이 있는 많은 작은 할당(예: 풀 할당자) HeapAlloc / HeapCreate 격리 또는 serialization 제어를 위한 프라이빗 힙을 만듭니다. 힙이 단독으로 단일 스레드인 경우에만 사용합니다 HEAP_NO_SERIALIZE .
COM interop(마샬링된 메모리) CoTaskMemAlloc 메모리가 COM 아파트 경계를 넘을 때 필요합니다. MIDL에서 생성된 스텁은 CoTaskMemAlloc/CoTaskMemFree를 사용합니다.
이동 가능한 메모리를 사용하는 레거시 코드 GlobalAlloc / LocalAlloc 새 코드는 사용하지 마세요. 이는 HeapAlloc에 오버헤드를 추가하며, 주로 클립보드 작업 및 필요한 특정 Win32 API와의 이전 버전과의 호환성을 위해 존재합니다.

Important

항상 할당 및 할당 취소 함수를 올바르게 페어링합니다. 할당된 메모리는 HeapAlloc 해제해야 합니다.HeapFreefree()LocalFree 할당/할당 취소 패밀리를 혼합하면 진단하기 어려운 힙 손상이 발생합니다.

메모

VirtualAlloc 및 HeapAlloc: VirtualAlloc는 페이지 세분성(최소 4KB, 예약 SYSTEM_INFO.dwAllocationGranularity정렬됨, 일반적으로 64KB)에서 작동합니다. VirtualAlloc을 사용하여 많은 작은 개체를 할당하면 주소 공간이 낭비됩니다. 작고 빈번한 할당에는 HeapAlloc(또는 malloc/new)를 사용합니다. 큰 주소 영역을 예약하거나, 페이지 보호를 제어하거나, 사용자 지정 할당자를 구현해야 하는 경우 VirtualAlloc를 사용합니다.

자세한 비교

다음은 다양한 메모리 할당 방법을 간략하게 비교한 것입니다.

GlobalAlloc, LocalAllocHeapAlloc 함수는 궁극적으로 동일한 힙에서 메모리를 할당하지만 각각은 약간 다른 기능 집합을 제공합니다. 예를 들어, 메모리를 할당할 수 없는 경우 LocalAlloc 에서 사용할 수 없는 기능을 발생하도록 HeapAlloc에 지시할 수 있습니다. LocalAllocHeapAlloc에서 사용할 수 없는 기능인 핸들 값을 변경하지 않고 다시 할당하여 기본 메모리를 이동할 수 있도록 하는 핸들 할당을 지원합니다.

32비트 Windows 시작하여 GlobalAllocLocalAlloc는 프로세스의 기본 힙에 대한 핸들을 사용하여 HeapAlloc를 호출하는 래퍼 함수로 구현됩니다. 따라서 GlobalAllocLocalAllocHeapAlloc보다 오버헤드가 더 큽니다.

다른 힙 할당자는 서로 다른 메커니즘을 사용하여 고유한 기능을 제공하므로 올바른 함수로 메모리를 해제해야 합니다. 예를 들어 HeapAlloc로 할당된 메모리는 LocalFree 또는 GlobalFree가 아닌 HeapFree로 해제해야 합니다. GlobalAlloc 또는 LocalAlloc로 할당된 메모리는 해당 전역 또는 로컬 함수를 사용하여 쿼리, 유효성 검사 및 해제되어야 합니다.

VirtualAlloc 함수를 사용하면 메모리 할당에 대한 추가 옵션을 지정할 수 있습니다. 그러나 할당은 페이지 세분성을 사용하므로 VirtualAlloc 를 사용하면 메모리 사용량이 높아질 수 있습니다.

malloc 함수는 런타임에 종속되는 단점이 있습니다. 연산자는 컴파일러 종속 및 언어 종속이라는 단점이 있습니다.

CoTaskMemAlloc 함수는 C, C++또는 Visual Basic 잘 작동할 수 있다는 장점이 있습니다. MIDL은 CoTaskMemAllocCoTaskMemFree 를 사용하여 메모리를 마샬링하므로 COM 기반 애플리케이션에서 메모리를 공유하는 유일한 방법이기도 합니다.

예제

전역 및 로컬 함수

힙 함수

가상 메모리 함수