왜 쓰는가?
C 프로그램에서 저수준의mmap
과munmap
함수를 사용해서 생성하고 삭제할 수 있지만, 추가적인 가상 메모리를 런타임에 획득할 필요가 있을 때, 동적 메모리 할당기를 사용하는 것을 좀 더 편리하고 호환성이 좋다.
동적 메모리 할당기(dynamic memory allocator)는 아래 그림과 같이 힙(heap)이라고 하는 프로세스의 가상메모리 영역을 관리한다.
시스템마다 다르지만, 일반적으로 힙이 미초기화된(uninitialized) 데이터 영역 직후에 시작해서 위쪽(높은 주소 방향)으로 커지는 무요구(demand-zero) 메모리 영역이라고 가정한다. 각각의 프로세스에 대해서, 커널은 힙의 꼭대기를 가리키는 변수 brk
(break)를 사용한다.
명시적(explicit) 할당기 : malloc()
, free()
묵시적(implicit) 할당기 : garbage collector(Java, List, ML 등 하위수준 언어)
#include <stdio.h>
#include <stdlib.h>
void foo(int n)
{
int i, *p;
/* Allocate a block of n ints */
p = (int *)malloc(n * sizeof(int));
if (p == NULL)
{
perror("malloc");
exit(0);
}
/* Initialize allocated block */
for (i = 0; i < n; i++)
p[i] = i;
/* Return allocated block to the heap */
free(p);
}
int main()
{
foo(5);
}
위 그림과 같이 malloc()
은 가상 메모리에 값을 할당하고, free()
는 할당된 값을 가상 메모리에서 반환하는 것을 알 수 있다.