메모리 누수

slee2·2021년 9월 13일
0

42프로젝트를 진행한다면 빼먹을 수 없는 것중에 하나가 바로 메모리 관리입니다. 이 메모리 관리에 대해 42서울 카뎃들은 많은 의견을 나누며 논쟁을 치루었습니다. 이 글은 카뎃들의 생각을 바탕으로 정리한 글이 되겠습니다.

메모리 누수에 대한 정확한 이해

저만 그랬는지 몰랐는데 처음 42카뎃이 되고 프로젝트를 진행하면서 메모리 누수란 말록후에 해제를 하지 않는 것이라고 이해를 했었습니다. 그런데 실험을 하다보면 단순히 말록후에 값을 넣는 것은 누수가 되지 않습니다.

누수란 말록 후에 그 주소값을 갖고 있는 변수가 다른 값으로 대체되어 말록이 되어있는 주소값이 미아가 되버리는 경우를 누수라고 합니다.

쉽게 예를 들면 밑에처럼 그냥 다른값을 넣으면 누수가 생깁니다. 왜? a가 b의 스택메모리에 있는 주소값을 갖게 되었기 때문에 이전에 말록으로 인해 힙 메모리에 있던 주소값이 혼자 덩그러니 남게 되었기 때문입니다.

exit()쓰면 뭐 메모리 관리 알아서 해주는거 아닌가요?

결과적으로는 메모리 해제는 해줍니다. 하지만 누수는 처리하지 못합니다. 그래서 exit함수를 쓰더라도 누수는 없게 해줘야합니다. 애초에 코드를 설계할 때 누수는 없도록 만들어야 합니다. 메모리 할당과 누수는 엄연히 다른 개념이니까요.
예시를 하나 들어보겠습니다. 카뎃이라면 처음에 누수에 자주 걸리는 ft_split을 보겠습니다.

음 옛날에 하고 정리를 따로 안해서 코드가 난잡하네요. 여기서 두번째 말록(a[i[2]] = (char *)malloc ~~) 부분을 보겠습니다. 이 코드 밑에 말록을 실패했을때 따로 처리를 해주죠? 이건 왜 해주는 걸까요?

이 문제는 이 ft_split이라는 함수를 사용할때 어떤 문제가 발생하는지 알아봐야합니다.

char	**d;
char	b[5] = "a b c";

ft_split(b, ' ') = d;

자. 간단하게 띄어쓰기를 기준으로 2차원 배열로 만드는 프로그램을 만들었다고 가정을 해보겠습니다. 중간에 말록을 실패하여(위 사진의 2번째 말록에서) 그냥 return 0을 했다고 가정합시다.

그러면 이전에 말록을 해서 남아있는 메모리는 어떻게 될까요?

원래 char **a는 반환되는 값입니다. 말록되어 주소값이 들어간 **a이 반환하여 d로 들어가는 것이 정상 작동이죠. 그런데 말록실패로 그냥 return 0을 해버린다면 주소값이 들어간 char **a을 외부로 반환할 수가 없게 됩니다. ft_split안에 있던 말록 주소는 아무도 코드의 어디에 있는지 찾을 수가 없는 것입니다. 그렇게 누수가 생기기 때문에 free를 해준 다음에 return 0을 해줘야 하는 것입니다.

마무리

메모리 관리는 중요합니다. 그래서 평가할때 엄격히 관리되어야 합니다. 단, exit이전에 메모리 누수가 있는건지 단순히 말록이 된건지 확실이 하고 개념을 알아야 좀 더 발전된 42카뎃이 될 수 있을 것 같습니다.

0개의 댓글

관련 채용 정보