|

C malloc free는 왜 짝으로 봐야 할까: 메모리 누수를 줄이는 기본 습관

C malloc free 메모리 누수 대표 이미지
C 언어 malloc과 free는 왜 짝으로 봐야 할까를 한눈에 정리합니다.

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를 확인했습니다.

함께보면 좋은 글