동적 할당은 런타임에 필요한 만큼 메모리를 확보하는 기술이다.
할당받은 메모리의 주소를 잃어버리지 않도록 ‘소유권’ 관리를 철저히 해야 한다.
동적 할당 및 소유권 관리 예시
#include <stdio.h>
#include <stdlib.h>
int* create_array(int size) {
// 함수 내부에서 메모리 할당 (소유권이 이 함수에 있음)
int *arr = (int*)malloc(sizeof(int) * size);
if (arr == NULL) return NULL;
for (int i = 0; i < size; i++) arr[i] = i * 10;
return arr; // 할당된 메모리의 주소를 반환하여 소유권을 호출자에게 넘김
}
int main() {
int size = 5;
int *my_arr = create_array(size); // 소유권 획득
if (my_arr != NULL) {
for (int i = 0; i < size; i++) printf("%d ", my_arr[i]);
printf("\n");
free(my_arr); // 사용 완료 후 소유권을 가진 쪽에서 해제
my_arr = NULL;
}
return 0;
}
코드 설명:
– malloc으로 할당된 메모리의 주소를 반환하는 함수는 호출자에게 메모리 해제의 책임(소유권)을 넘긴다는 것을 명시적으로 이해해야 한다.
– 메모리를 할당받은 포인터 변수의 값을 잃어버리면(다른 값을 대입하거나 스코프를 벗어나면) 해당 메모리는 해제할 방법이 없어 누수가 발생한다.
C언어 동적할당과 내 메모리 소유권 찾기를 보다가 예전에 틀렸던 풀이가 바로 떠올랐다.
시작은 가벼웠는데 생각보다 고민이 길어졌다.
헤더와 소스 분리 기준을 다시 잡으며 정리 순서를 바꿔 보니까 어느 순간부터 ‘왜’를 빼고 외우기만 해서 스스로 설명이 안 됐다.
메모를 보고 바로 설명해 보려다 막혀서, 설명 대신 실행 결과부터 비교했다.
결국 핵심은 큰 이론보다 작은 확인이었다.
C언어 동적할당과 내 메모리 소유권 찾기도 그 방식이 통했다.
이해가 단번에 끝나진 않았지만, 오늘은 분명히 한 칸 앞으로 갔는 것 같다.