C++

C/C++ free/delete 없이 프로그램을 종료한다면?

delete/free 는 C++/C 개발할 때 꼭 빼먹어서는 안되는 중요한 키워드이다.
관련해서 학부 시절에 실습 과제를 제출하는 시스템이 있었다.
어려운 실습 과제에 허덕이던 동기들끼리 농담으로 “malloc 으로 동적할당을 크게 잡아버리고 free 안해서 서버 다운시켜 버리자.” 라는 얘기를 한 적이 있다.

그 당시에는 잘 몰라서 위와 같이 코딩해서 제출하면 정말 서버가 다운되는 줄 알았지만
실제로는 그럴 일은 드물다.
왜냐면, 최근의 OS 들은 process 종료 시 사용중인 memory 를 자동으로 반환한다.
따라서 일반적인 경우 program lifecycle 이 끝난 뒤에는 memory 를 자동으로 반환 시켜줄 것이다. (그리고.. 과제 제출 시스템은 cpu / memory 사용량을 제어하는 cgroup 과 같은 시스템이 있지 않았을까..?)

그런데 이와같이 메모리 해제를 OS 에 의지하는 것은 나쁜 습관이다.
알고리즘 과제 혹은 간단한 컨버팅 프로그램 같이 몇초 내에 끝내는 간단한 로직이라면 문제가 발생하진 않겠지만 이보다 큰 스케일의 프로그램에 우리가 메모리 해제 없이 코딩한 프로그램을 이식시켜야 하는 상황이 온다면, 그리고 그 프로그램이 오랫동안 길게 동작하는 프로그램이라면 프로그램 실행중에 memory leak 이 발생할 것이고 점점 시스템 자원을 갉아먹어서 프로그램을 재시작 해야 하는 상황까지 오게 될 것이다.
어떤 프로그램을 사용할 때 처음 실행했을 때는 빠릿빠릿한데, 점점 사용하다보면 느려졌던 경우가 다들 한번씩은 있었을 것이다. 보통 최적화 문제가 있는 게임에서 이런 현상을 경험하는 유저들이 많다. 이런 경우가 자원 관리가 되지 않아서 발생하는 문제일 것이다.

그리고 또 한 가지는 메모리 해제를 명시적으로 해주면 클래스의 소멸 순서를 보장할 수 있기 때문에 이는 개발자의 의도대로 프로그램이 안정적으로 종료되는 것에 도움이 된다.

요약 정리

  1. Process 종료 시 Operating System 은 Process 가 사용중인 메모리를 자동으로 모두 반환 시킨다.
  2. 그렇지만 위와 같이 OS에 메모리 해제를 맡기는 습관은 잘 못된 습관이다.
    왜냐하면 우리는 앞으로 충분히 긴 시간 동안 동작하는 프로그램도 짜야하며, 이식성 좋고 안정적인 프로그램을 짜야한다.