매니지드 언어라고 들어보셨나요?
managed의 뜻은 "무언가가 관리되는" 이라는 의미입니다.
프로그래밍 언어에서 managed code는 메모리가 언어 레벨에서 관리되는 것을 의미합니다.
42에서 사용하는 언어인 C는 unmanaged code입니다.
메모리를 알아서 관리해주지 않기 때문에 개발자가 직접 메모리를 관리해줘야 합니다.
메모리를 직접 관리하다보니 적재적소에서 메모리를 관리하여 프로그램 퍼포먼스가 좋다는 장점이 있지만, 반대로 메모리를 제대로 관리하지 못 할 경우 메모리 누수가 발생할 위험이 있습니다.
42에서 작성하는 프로그램들은 기본적으로 메모리 누수를 대비하여야 합니다.
따라서 작성한 코드의 어떤 부분에서 메모리 누수가 발생하는지 확인할 수 있어야 하는데, 이때 valgrind를 사용합니다.
valgrind 프로그램실행
--leak-check=full 옵션 사용시 파일명과 라인 위치 출력
--show-leak-kinds=all 옵션 사용시 어떤 함수에서 누수가 발생하는지 체크
ex)
valgrind --leak-check=full ./so_long map/map.ber
valgrind 사용방법은 위와 같습니다.
valgrind를 실행하고, 옵션을 넣은 뒤 검사할 프로그램을 실행하면 됩니다.
valgrind가 검사를 마치면 위와 같이 결과 화면이 나오고, 메모리 누수가 없다면 no leaks are possible 이라는 문구가 출력됩니다.
메모리를 해제하지 않으면 누수가 발생된다는 사실은 쉽게 와닿지만, 그래서 실제로 프로그램을 작성할 때 어떤 경우에 누수가 발생하는지는 바로 와닿지 않을 수 있습니다.
보통은 프로그램 구동 시 메모리 할당 후 프로그램에서 할당된 메모리를 사용하다가 메모리를 해제하며 프로그램이 종료됩니다.
하지만 예외 처리 중에 프로그램이 종료되는 경우 할당된 메모리를 따로 해제해주지 않으면 누수가 발생할 수 있습니다.
예를들어 저는 so_long과제를 하면서 구조체를 초기화하고, 메모리를 할당한 뒤 맵데이터에 대한 예외처리를 해주었습니다.
만약 예외처리도 통과하고 게임이 정상적으로 실행된 후 종료된다면 메모리를 모두 해제하고 종료처리하기 때문에 누수가 없었지만, 예외처리를 통과하지 못하고 게임이 바로 종료되는 경우 메모리를 따로 해제하지 않은 상태에서 종료되어 누수가 발생하였습니다.
따라서 프로그램 종료 전에 메모리 해제를 체크하는 습관을 들이는게 좋겠습니다.
사실 메모리 누수에 대해 크게 신경쓰지 않고 있었는데 슬랙에서
"still reachable도 누수로 봐야하나?"
에대한 스레드가 열렸었고, 마침 so_long과제의 still reachable은 무시해야겠다고 결심한 시점에 그 스레드를 봐버려서 그날부터 이틀간 누수와의 전쟁을 시작하게되었습니다.
열받고 귀찮고 머리아프지만 다 잡아낼수는 있으니 열심히 누수와 싸워 이겨봅시다.
'코딩 > 42경산' 카테고리의 다른 글
[42경산] 뒤늦은 get next line 후기 (0) | 2024.09.04 |
---|---|
[42경산] 까먹기전에 정리하는 so_long (0) | 2024.08.24 |
[42경산] 까먹기전에 정리하는 minitalk (0) | 2024.07.12 |
c언어로 isalpha, isdigit, isalnum, isascii, isprint 함수 구현하는 방법 (0) | 2024.03.19 |
짧지만 굵었던 42경산 피신 리로드 후기 (0) | 2024.02.28 |