
C malloc free를 배울 때 가장 중요한 것은 함수 이름을 외우는 것이 아닙니다. 누가 메모리를 빌렸고, 누가 언제 돌려줘야 하는지 책임을 정하는 것입니다.
동적 메모리에서 실수는 보통 한 가지 질문을 놓칠 때 생깁니다. 이 포인터가 가리키는 메모리의 소유자는 누구인가를 계속 추적해야 메모리 누수와 해제 후 사용을 줄일 수 있습니다.
C malloc free를 먼저 책임으로 이해하기
malloc은 실행 중 필요한 크기의 메모리를 요청하고, 성공하면 그 시작 주소를 돌려줍니다. 실패하면 NULL을 돌려줄 수 있으므로 확인이 필요합니다.
int *numbers = malloc(sizeof(int) * count);
if (numbers == NULL) {
return 1;
}여기서 numbers는 동적으로 할당된 메모리를 가리키는 포인터입니다. 이 포인터 자체는 지역 변수지만, 가리키는 메모리는 free하기 전까지 남아 있습니다.
free는 빌린 메모리를 돌려주는 일이다
malloc으로 받은 메모리는 더 이상 필요하지 않을 때 free로 해제해야 합니다. 해제하지 않으면 프로그램이 그 메모리를 계속 붙잡고 있게 됩니다.
free(numbers);
numbers = NULL;free 뒤에 포인터를 NULL로 바꾸는 습관은 모든 버그를 막지는 못하지만, 같은 포인터를 실수로 다시 쓰는 경우를 줄이는 데 도움이 됩니다.
메모리 누수는 free를 잊을 때 생긴다
void read_data(size_t count) {
int *data = malloc(sizeof(int) * count);
if (data == NULL) return;
if (count == 0) {
return; // free(data)를 거치지 못한다
}
free(data);
}중간에 return하는 경로가 있으면 해제 코드가 빠지기 쉽습니다. 그래서 C 코드에서는 실패 경로와 조기 종료 경로까지 함께 보아야 합니다.
double free와 use-after-free는 더 위험하다
- double free: 이미 해제한 메모리를 다시 free하는 실수
- use-after-free: 해제한 메모리를 계속 읽거나 쓰는 실수
- 둘 다 실행 중 예측하기 어려운 버그나 보안 문제로 이어질 수 있음
free(buffer);
// buffer[0] = 'A'; // 해제 후 사용: 위험
// free(buffer); // 중복 해제: 위험실무에서 지킬 만한 기본 습관
- malloc 직후 NULL 확인하기
- malloc과 free의 책임 위치를 가까이 두기
- 중간 return이 있는 함수에서는 해제 경로를 따로 점검하기
- 소유권을 넘기는 함수라면 주석이나 함수 이름으로 의도 드러내기
정리
C malloc free는 문법보다 책임의 문제입니다. 메모리를 할당한 뒤에는 그 메모리를 누가 해제할지 정해야 하고, 모든 실행 경로에서 그 약속이 지켜지는지 확인해야 합니다.
내부 글은 C언어 malloc free 정리, C 언어 비트 연산자는 언제 쓸까, C 언어 argc argv란 무엇일까와 함께 보면 좋습니다. 외부 기준은 cppreference – malloc, cppreference – free를 확인했습니다.