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는 따로 정의된 함수로 한다. 위의 함수의 문제점으로 올바른 것은?
- Afill이 0 이외의 값을 반환했을 때 buf를 해제하지 않고 돌아가므로, 확보한 영역이 해제되지 않은 채 남는다
- Bmalloc의 반환값을 확인하지 않으므로, 확보에 실패했을 때 NULL을 참조한다
- Cfree 후에 buf를 사용하고 있으므로, 해제한 영역을 참조한다
정답과 해설 보기
정답: A. fill이 0 이외의 값을 반환했을 때 buf를 해제하지 않고 돌아가므로, 확보한 영역이 해제되지 않은 채 남는다
malloc으로 확보한 영역은 free로 해제할 때까지 남습니다. fill이 실패하여 return -2로 돌아가는 경로에서는 free가 호출되지 않고 buf의 값(주소)도 사라지므로, 그 영역은 다시는 해제할 수 없습니다. 이를 메모리 누수라고 하며, 함수가 반복해서 호출되면 사용할 수 있는 메모리가 계속 줄어들기 때문에 오랫동안 계속 동작하는 임베디드 기기나 서버에서 특히 문제가 됩니다. 돌아가기 전에 free(buf)를 호출하거나, 해제 처리를 함수 마지막의 한 곳에 모읍니다.