힙 함수

각 프로세스에는 시스템에서 제공하는 기본 힙이 있습니다. 힙에서 자주 할당하는 애플리케이션은 프라이빗 힙을 사용하여 성능을 향상시킬 수 있습니다.

프라이빗 힙은 호출 프로세스의 주소 공간에서 하나 이상의 페이지 블록입니다. 프라이빗 힙을 만든 후 프로세스는 HeapAllocHeapFree 와 같은 함수를 사용하여 해당 힙의 메모리를 관리합니다.

또한 GetProcessHeap 함수에서 반환된 핸들을 사용하여 프로세스의 기본 힙에서 메모리를 관리하는 데 힙 함수를 사용할 수 있습니다. 새 애플리케이션은 이 목적을 위해 전역 및 로컬 함수 대신 힙 함수를 사용해야 합니다.

프라이빗 힙에서 할당된 메모리와 다른 메모리 할당 함수를 사용하여 할당한 메모리 간에는 차이가 없습니다. 전체 함수 목록은 메모리 관리 함수의 표를 참조하세요.

참고

스레드는 GetProcessHeap 또는 HeapCreate 함수에서 반환된 핸들을 사용하여 스레드가 만들고 관리하는 프로세스의 기본 힙 및 프라이빗 힙에 대해서만 힙 함수를 호출해야 합니다.

 

HeapCreate 함수는 호출 프로세스에서 HeapAlloc 함수를 사용하여 메모리 블록을 할당할 수 있는 프라이빗 힙 개체를 만듭니다. HeapCreate 는 힙의 초기 크기와 최대 크기를 모두 지정합니다. 초기 크기는 힙에 처음 할당된 커밋된 읽기/쓰기 페이지의 수를 결정합니다. 최대 크기는 예약된 페이지의 총 수를 결정합니다. 이러한 페이지는 힙이 증가할 수 있는 프로세스의 가상 주소 공간에 연속 블록을 만듭니다. HeapAlloc의 요청이 커밋된 페이지의 현재 크기를 초과하는 경우 이 예약된 공간에서 추가 페이지가 자동으로 커밋됩니다. 페이지가 커밋되면 프로세스가 종료되거나 HeapDestroy 함수를 호출하여 힙이 제거될 때까지 커밋되지 않습니다.

프라이빗 힙 개체의 메모리는 해당 개체를 만든 프로세스에서만 액세스할 수 있습니다. DLL(동적 연결 라이브러리)이 프라이빗 힙을 만드는 경우 DLL을 호출하는 프로세스의 주소 공간에서 이 작업을 수행합니다. 해당 프로세스에만 액세스할 수 있습니다.

HeapAlloc 함수는 프라이빗 힙에서 지정된 바이트 수를 할당하고 할당된 블록에 대한 포인터를 반환합니다. 이 포인터는 HeapFree, HeapReAlloc, HeapSizeHeapValidate 함수에서 사용할 수 있습니다.

HeapAlloc에서 할당한 메모리는 이동 가능하지 않습니다. HeapAlloc에서 반환된 주소는 메모리 블록이 해제되거나 다시 할당될 때까지 유효합니다. 메모리 블록을 잠글 필요가 없습니다.

시스템은 프라이빗 힙을 압축할 수 없으므로 조각화될 수 있습니다. 다양한 할당 크기로 대량의 메모리를 할당하는 애플리케이션은 낮은 조각화 힙 을 사용하여 힙 조각화를 줄일 수 있습니다.

힙 함수를 사용할 수 있는 방법은 프로세스가 시작될 때 프라이빗 힙을 만들어 프로세스의 메모리 요구 사항을 충족할 수 있는 초기 크기를 지정하는 것입니다. HeapCreate 함수 호출에 실패하면 프로세스가 종료되거나 사용자에게 메모리 부족을 알릴 수 있습니다. 그러나 성공하면 프로세스에 필요한 메모리가 보장됩니다.

HeapCreate에서 요청한 메모리는 연속되거나 연속되지 않을 수 있습니다. HeapAlloc에 의해 힙 내에 할당된 메모리는 연속적입니다. HeapAlloc에서 할당한 메모리를 제외하고 힙의 메모리에 쓰거나 읽지 않아야 하며 HeapAlloc에서 할당한 두 메모리 영역 간의 관계를 가정해서는 안 됩니다.

HeapFree에서 해제된 메모리를 어떤 방식으로든 참조해서는 안 됩니다. 메모리가 해제되면 메모리에 있었을 수 있는 모든 정보가 영원히 사라집니다. 정보가 필요한 경우 정보가 포함된 메모리를 해제하지 마세요. 메모리에 대한 정보를 반환하는 함수 호출(예: HeapSize)은 가짜 데이터를 반환할 수 있으므로 해제된 메모리와 함께 사용할 수 없습니다.

HeapDestroy 함수는 프라이빗 힙 개체를 삭제합니다. 힙 개체의 모든 페이지를 커밋 해제하고 해제하고 힙에 대한 핸들을 무효화합니다.

메모리 할당 방법 비교