C 언어 기초

int process(int n) {
    int *buf = malloc(n * sizeof(int));
    if (buf == NULL) return -1;
    if (fill(buf, n) != 0)
        return -2;
    use(buf, n);
    free(buf);
    return 0;
}

fill과 use는 따로 정의된 함수로 한다. 위의 함수의 문제점으로 올바른 것은?

  1. Afill이 0 이외의 값을 반환했을 때 buf를 해제하지 않고 돌아가므로, 확보한 영역이 해제되지 않은 채 남는다
  2. Bmalloc의 반환값을 확인하지 않으므로, 확보에 실패했을 때 NULL을 참조한다
  3. Cfree 후에 buf를 사용하고 있으므로, 해제한 영역을 참조한다
정답과 해설 보기

정답: A. fill이 0 이외의 값을 반환했을 때 buf를 해제하지 않고 돌아가므로, 확보한 영역이 해제되지 않은 채 남는다

malloc으로 확보한 영역은 free로 해제할 때까지 남습니다. fill이 실패하여 return -2로 돌아가는 경로에서는 free가 호출되지 않고 buf의 값(주소)도 사라지므로, 그 영역은 다시는 해제할 수 없습니다. 이를 메모리 누수라고 하며, 함수가 반복해서 호출되면 사용할 수 있는 메모리가 계속 줄어들기 때문에 오랫동안 계속 동작하는 임베디드 기기나 서버에서 특히 문제가 됩니다. 돌아가기 전에 free(buf)를 호출하거나, 해제 처리를 함수 마지막의 한 곳에 모읍니다.

이 분야 연습하기 분야로 돌아가기

C 언어 기초의 다른 문제

  1. 위의 함수 make가 반환하는 포인터에 대해 올바른 것은?
  2. C 언어에서 free(p); 바로 다음에 p = NULL;이라고 쓰는 것이 권장되는 이유로 가장 적절한 것은?
  3. 위의 함수 save에 8문자의 문자열 "ABCDEFGH"를 전달했다. 일어나는 일로 올바른 것은?
  4. C 언어에서 NULL 포인터를 참조했을(p가 NULL일 때 *p를 읽었을) 때의 설명으로 올바른 것은?
  5. char는 1바이트, int는 4바이트이며, int를 4의 배수 주소에 맞춰 두는 일반적인 환경으로 한다. 위의 코드를 실행했을 때의 출력으로 올바른 것은?