이런 경우 free로 메모리를 해제하지 않아도 될까요?
글쓴이: shodhpfooqmm / 작성시간: 토, 2012/02/11 - 1:29오전
프로그램은 10분 내외로 돌아가는데
큰 메모리(30기가 정도)를 사용합니다.
프로그램 종료시 명시적으로 free를 안해주어도 OS가 알아서 컨트롤 한다고 알고있는데
항상 10분 내외로 돌아가고 종료하는 이 프로그램(종료하기 전 까지는 메모리를 사용하는)이 끝날 때 메모리를 해제할 필요가 있을까요?
제 생각에는 굳이 명시적으로 해주지 않아도 될 것 같고,
현재도 잘 돌아가고 있는데
"메모리를 할당했으면 꼭 해제해야 한다" 라는 말을 많이 들어서 약간 걸리네요
또한 루틴안에 명시적인 메모리 해제 코드를 넣으면 속도가 느려질까 생각되기도 하구요.
kldp 분들이라면 어떻게 하시겠어요?
Forums:
저라면 안합니다
"메모리를 할당했으면 꼭 해제해야 한다"라는 건 안 그러면 쓰지도 않는 메모리가 계속 쌓여서 문제가 되니까 그런 말이 나온 거고요...
해제하자 마자 프로그램 종료를 할 거면, 성능면에서는 해제를 안하는 쪽이 (미세하게) 더 성능이 좋겠죠.
사실 성능은 거의 차이가 없으니 프로그램의 일관성 측면에서 "그래도 해제하는 게 좋다!"라고 생각할 수도 있는데, 그건 개인적 취향의 문제라고 생각합니다.
해제안해도 됩니다. 일반적으로 종료를 하더라도 해제를
해제안해도 됩니다. 일반적으로 종료를 하더라도 해제를 하라는 의미는
그것이 좋은 프로그램 습관이기 떄문입니다.
가정 #1. 해당 프로세스이 종료될때까지, 해당 메모리가 필요하다.
가정 #2. 메모리를 해제한 상황에서 실행시켜야 할 로직이 없다.
위의 가정 #1, #2을 놓고 봤을때는 해제안하셔도 됩니다.
글쓰신분도 저 가정들 때문에, 굳이 해제할 이유를 못 찾으시는것 같습니다.
하지만, 저는 해제하는것을 추천합니다.
왜냐면, 가정 #1, #2는 언제든지 바뀔수도 있거든요.
소프트웨어는 꾸준히 성장하고 바뀝니다. 그래서, 방법론이 나오고
최대한 flexibility 와 molecularity 같은 것들을 고려하면서 프로그램을 짜는것입니다.
지금 사용하시는 로직(30GB의 메모리를 사용하는)은 해당 프로그램의 실행과 함께시작하여, 종료로 끝납니다.
하지만, 향후에 해당 로직을 다른 프로그램에서도 사용할수도 있고, 지금 프로그램도 새로운 기능을 추가하다보면
메모리 해제후에도 처리해야할 로직이 생길수도 있습니다.
그래서, 평소에 메모리 해제 같은것을 잘 처리해놨으면, 나중에 다른 용도, 또는 기능이 확장됐을때
좀더 완성도 있는 모듈이 됩니다.
소프트웨어의 재활용성, 확장성 이런거 하나도 고민하고 싶지않고,
그저 현재 가지고 있는 프로그램이 해당 로직의 전부이고, 아무것도 고민하고 싶지 않으시면,
그냥 해제하지 않으셔도 됩니다.
하지만, 그런식의 프로그래밍 스타일에 익숙해지고, 습관이 들어버리면
경력이 쌓였을 때, 고치기 쉽지않습니다.
오타수정: molecularity =>
오타수정: molecularity => modularity
...
전체적으로 수긍이 가는 말인데, 약간 지나치다 싶어서 부연을 하자면,
"확장성을 너무 고려하다가 앞으로 쓰지도 않을 기능을 넣어서 설계하는 것"도 개발자가 빠지기 쉬운 함정 중 하나죠. 그러니까 지금이 어떤 케이스에 해당하는지는 그때그때 잘 생각해봐야 합니다.
물론 100% 정답은 없습니다. 삼년 뒤 그 기능이 필요할지 아닐지를 지금 알 수 있으면 개발을 왜 합니까 복권을 사지... -_-
"확장성을 너무 고려하다가 앞으로 쓰지도 않을 기능을
"확장성을 너무 고려하다가 앞으로 쓰지도 않을 기능을 넣어서 설계하는 것"도 개발자가 빠지기 쉬운 함정 중 하나죠
넵. 저도 그점을 항상 경계하려고 노력합니다만, 확장성과 단순함의 적절한 교차점을 찾는게 참 힘든것 같습니다.
이부분은 아무래도 각 프로그래머의 디자인철학에 좌지우지 되는지라 정답은 없다는것에 100% 공감합니다.
일반적으로는, 자원해제는 디자인철학과 크게 상관없이 되도록 지키라고 후배들한테 말합니다.
오로지, 자원해제를 하지말아야하는 명확한 이유가 있을때만,
해당 이유를 in-line comment등을 통해 충분히 문서화하고 해제하지말라고 합니다.
물론, 이런 부분도 제 개인적인 디자인 취향에 근거했다고 할수 있기에,
무조건 해야한다던지의 표현보다는, "저라면..., ~~를 추천합니다" 등의 표현을 써서 말하고 합니다.
저도 몇년후 제가 필요할 기능이 보이는, 예지능력이 있었으면 참 좋았을텐데....가끔 생각해봅니다.
프로그램에서 해제하나 커널이 해제하나 어쨌든 해제해서
프로그램에서 해제하나 커널이 해제하나 어쨌든 해제해서 풀어주는데 들어가는 리소스가 있긴 있겠죠
10분의 실행 시간이 끝난 후 종료될 때 프로그램에서 메모리 해제를 하는데 걸리는 시간이 "성능 저하"가 느껴질 정도로 오래 걸릴지도 의문이네요.
끝나는 그 순간에 있는 작은 성능 저하(메인 루틴에 의한 성능 저하보다 작을 것이 뻔한 성능저하)가 과연 같이 돌고 있는 다른 프로그램을 방해할 정도의 성능 저하인지도 의문이네요. 그런걸 고려해야 할 정도로 최적화를 해야 한다면, 메인 루틴을 1% 최적화 하는게 훨씬 더 낫겠죠.
이런 경우는 정말 해도 되고 안해도 되는 일인데, 정말 개인 취향에 따라 다른 것 같네요. 저라면 귀찮아서 안합니다. 문제가 생기면 그때 고려해보겠죠.
피할 수 있을때 즐겨라! http://melotopia.net/b
valgrind를 돌리면..
메모리 오류 점검을 위해 valgrind를 돌리면 해당 문제가 리포트 될 것입니다.
이점으로도 free가 꼭 필요하다고 생각합니다.
여러 프로그램이 의심받는 상황 또는 검수등에서 valgrind등을 사용해 메모리 누수가 있다는 경고가 뜨면 일단 이미지를 버리는지라...
해제의 문제가 완성도의 문제 일듯....
나중에 다른 코드를 더 넣거나, 유지 보수를 할때.. 의아하게 여길때가 있을듯 합니다.
분명, 할당은 하고 해제를 안하니.. 이게 멀까? 라고 말이죠. 완성도가 떨어져 보일듯 합니다.
머..실제 완성도와는 상관이 없더라도 말이죠.
누가 그러더군요...
작년에 valgrind 로 돌려보니 App 에서 free 를 안하더군요.
그래서, 회사 내부최고책임(?) 개발자에게 물어보니...
다음과 같은 답변이 왔습니다.
"의도된 메모리릭입니다."
malloc하고 free하지 않아도
malloc하고 free하지 않아도 OS가 알아서 메모리 해제를 알아서 해 주죠.
뿐만 아니라 thread, mutex 등등 resource 관리도 OS가 알아서 해 줍니다.
하지만!
malloc은 했는데 free 안하고 프로세스를 종료한다는 건
똥은 누웠는데 뒤 안닦고 화장실 나오는 것과 마찬가지이죠.
malloc(new)과 free(delete)가 매칭될 수 있는 코드를 고집하는 것은
개발자의 로망이자 예의. ^^
www.gilgil.net
valgrind에서는...
다들 아시겠지만 valgrind에서는 "malloc했는데 더 이상 그 부분을 가리키는 포인터가 없어서 사용할 수 없는 영역"과 "malloc하고 free는 안했지만 그 부분을 가리키는 포인터가 아직 살아있어서 프로그램이 (아마도) 사용할 수 있는 영역"을 구분해서 보고합니다.
앞부분은 leak, 뒷부분은 still reachable이던가... 그렇게 나오죠. 뭐, 취향에 따라 두 가지 모두 leak으로 간주하겠다고 정책을 세울 수도 있겠지만요.
상황에 따라 좀 다르지 싶네요. 잠깐 쓰고 버릴
상황에 따라 좀 다르지 싶네요.
잠깐 쓰고 버릴 것(프로토타입 또는 개념증명 등)이나 혼자 쓰는 것이라면 제대로 돌기만 하면 상관없습니다.
하지만 팀작업이거나, 일정기간 유지보수를 해야한다거나, 인수인계의 대상이 된다면 제대로 만들어야죠.
또한 malloc과 free가 루프안에 있어서 성능이 걱정된다면(저는 그렇게 이해했습니다. 루틴->루프), 조금만 손보면 루프 밖으로 빼낼 수 있을겁니다.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
그런데 문제는 잠깐 쓰고 버릴 것, 테스트 목적 혹은
그런데 문제는 잠깐 쓰고 버릴 것, 테스트 목적 혹은 혼자 쓰게될 것이라고 생각하고 만든 프로그램이 결국 장기/정식 프로젝트가 되거나 나한테 유지보수가 돌아오는 경우도 있더라구요. (니가 만들었잖아. 그러니까 니가 관리해. ...응?)
그런 경우를 대비하기 위해서라도 미리 습관을 들이는게 좋지 않을까 싶습니다.
어설프게 메모리를 해제하려고 하다가 세그먼트폴트
어설프게 메모리를 해제하려고 하다가 세그먼트폴트 떨어지고 죽는 것보다
비록 메모리릭은 있지만 주어진 일을 다 해내는 것이 훨씬 좋습니다.
애초부터 메모리 할당과 해제가 명확하도록 설계되었고 그렇게 프로그래밍 했다면 좋겠는데...
전역 포인터를 남발하는 등의 만행을 저지른 소스가 있다면 메모리릭을 잡는다고 고생하는 것보다,
(게다가 어설픈 메모리 해제 때문에 세그먼트폴트가 떨어지면... ㅠ.ㅠ)
그냥 메모리 충분히 늘리고 정기적으로 해당 프로그램을 내렸다가 올리는 설계를 하는게 속이 편하지요.
내 블로그: http://unipro.tistory.com
앗.. 누군가 했더니. 나의 벗이로군....
앗.. 누군가 했더니. 나의 벗이로군....
댓글 달기