관리 메뉴

KorSA

HeapAlloc, LocalAlloc, GlobalAlloc 차이 본문

Development Experience/C, C++

HeapAlloc, LocalAlloc, GlobalAlloc 차이

Praiv. 2020. 11. 25. 18:03
320x100

참고> https://skensita.tistory.com/entry/HeapAlloc-LocalAlloc-GlobalAlloc-%EA%B0%81%EA%B0%81-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8B%A4%EB%A5%B8%EA%B0%80

 

1. Win16 운영체제에서는 프로그램마다 가지는 Local Heap과 Heap Manager가 가지는 Global Heap이 따로 존재했지만 Win32 운영체제에서는 따로 존재하지 않음. 즉, Win32 운영체제에서는 Local Heap과 Global Heap이 동일하고 이말인 즉슨 LocalAlloc과 GlobalAlloc이 동일함을 의미

2. LocalAlloc은 어플리케이션의 Default Heap에 메모리를 할당함. Default Heap은 프로세스가 생성되고 가상 주소 공간이 생겨날 때 같이 생성되는 메인 힙이고, 한 어플리케이션이 하나씩 가지게 되는 메인 힙이다.

3. HeapAlloc은 임의의 Heap에 메모리를 할당함. HeapCreate로 만든 힙일 수도 있고 GetProcessHeap으로 가져온 Default Heap일 수도 있음.

4. LocalAlloc과 HeapAlloc의 두번째 차이점은 리턴 값이다. LocalAlloc은 핸들을 리턴하고 HeapAlloc은 포인터를 리턴한다.
핸들을 사용하면 동기화 등의 기능을 쓸 수 있다. 또한 LocalAlloc에서 핸들을 주는 다른 이유는 GMEM_MOVEABLE 특성으로 LocalAlloc을 호출한 경우 Heap Manager가 힙 메모리 단편화를 제거하거나 힙 공간이 부족할 때 메모리 블록을 이동하게 되는데, 이 때 핸들이 아닌 포인터로 리턴했을 경우 잘못된 주소를 참조하는 사고가 발생하기 때문이다.

5. GlobalAlloc, LocalAlloc, HeapAlloc 함수들은 궁극적으로 동일한 힙에 메모리를 할당하지만, 약간의 차이를 가지고 있다. 
HeapAlloc은 메모리가 할당될 수 없으면 예외를 발생시킬 수 있으며, LocalAlloc은 이런 기능이 없다. 
LocalAlloc은 핸들 할당을 지원함으로써 핸들값을 바꾸지않고 재할당을 통해 기초메모리 (underlying memory) 를 이동시킬 수 있으며, HeapAlloc은 이런 기능이 없다.

6. 메모리 해제의 경우 HeapAlloc으로 할당한 메모리는 HeapFree로 해제해야 한다.

7. CoTaskMemAlloc함수는 C/C++/Visual Basic 모두에서 잘 작동하는 이점을 가지고 있다.
 또한 MIDL (Microsoft Interface Definition Language) 이 메모리를 마샬링*하는데 CoTaskMemAlloc / CoTaskMemFree를 사용하므로, COM 기반 애플리케이션에서 메모리를 공유하는 유일한 방법이다.


* 윈도우 메모리 구조는 Programming Apps for Windows란 책에 가장 자세히 설명되어 있습니다

728x90
728x90
Comments