동적 메모리 개념
개요
- 예상치 못하게, 사용자가 필요한 만큼의 메모리를 프로그램 작동 도중(runtime)에 할당받고자 할 때, 동적 메모리 할당 진행
- 동적 메모리 할당기는 필요한 메모리를 수용할 수 있는 최소한의 크기를 가진 블록을 할당받아 heap이라는 가상메모리 영역을 관리
- 시스템 효율 및 메모리 활용을 극대화하기 위해 사용
명시적 할당기(malloc package)
- 할당기는 메모리 할당과 반환을 모두 수행해야 하는 명시적 할당기와 메모리 할당만 수행하는 묵시적 할당기로 구분
- C 표준 라이브러리는 malloc 패키지를 통해 명시적 할당기를 제공
1. void *malloc(size_t size)
- 데이터를 적정하게 수용할 수 있는 메모리를 할당해주어야 하므로,
"(data_type) malloc (sizeof (data_type) * 할당크기) " 방식을 통해 할당
- 메모리 할당 성공시 최소한의 size byte로 할당된 메모리 블록의 포인터를 반환
- 실패시, NULL을 반환하고 errno로 오류처리 진행 (ex. errno = 0)
2. void free(void *p)
- 아무것도 반환하지 않음
- 동적한 메모리를 해제하기 위해 사용
- 단, 이전에 malloc 함수 호출에 의해 할당된 메모리에 한해서만 사용 가능
3. 추가 기능
1) calloc : 할당된 블록을 0으로 초기화해주는 malloc version
2) realloc : 기존에 할당받은 블록의 사이즈 변경 가능
3) sbrk : 힙 내부에서 블록의 크기를 확대 또는 감소 가능
<동적 할당시 유의 사항>
1. application
- malloc 과 free 요청에 의한 임의의 배열은 잠재적 issue 발생 여지가 있음
- free 요청 대상은 반드시, malloc에 의해 할당된 블록이어야 함
2. allocator(할당기)
- 할당된 블록의 개수나 사이즈를 조절할 수 없음
- malloc 요청에 즉시 응답해야 함
- 반드시 free memory 영역에 블록 할당할 것
- 모든 요구사항을 충족하는 블록을 할당할 것
- malloc에 의해 할당된 블록은 이동할 수 없음