이 포스트의 목적

  • 구현한 safe delete를 기록해 두려고

이 포스트의 준비물

  • Firefox 4.0 b7
  • VMware player 3.1.2
  • Debian 5 64bit
  • g++ 4.3.2
  • vim 7.1.314
  • project.vim
  • make

참조 링크

참조 인물

  • 김문순


내가 처음 safe delete 개념을 알게 된 것은 2008년 상반기 쯤 KGCA 학원에서 문순이가 PT 할때 였다. 그때 별다른 느낌이 없었고, 가져다가 썻다. 그때 코드가 #define SAFE_DELETE(x) if(x) delete x; x = 0; 이런식으로 되어 있었다.

사용하는데 별 문제는 없었으나, 2008년 하반기 졸업 프로젝트 진행 중, 여러 사람들이 정말 신비한 증상(컴파일 에러)을 겪는 것을 확인 했었고, 그 문제가 바로 #define 이름 때문이였다. #define 을 쓸때 무척 주의 해야 한다는건 알았지만, 막상 겪어 보니, 정말 신비한 증상(컴파일 에러)이기 때문에, 템플릿 함수로 빼야겠다고 생각했다.

그때 나왔던 초안이 다음과 같다.

이렇게 사용하다가 문제점이 발생했다.

만약 delete 전에 특정 함수를 호출 한다면 어떻게 할까?

예를 들면, 리소스를 생성 한 후 리소스 해제 없이 그냥 delete 만 하면 자원 누수가 생기는 상황이다. 결국 delete 전에 특정 함수를 호출해야 된다. 그래서 다음과 같은 코드를 만들게 되었다.

이렇게 사용하다 다시 문제점이 발생했다.

만약 const pointer 일 경우, 어떻게 할까?

결국 const 일 경우, 함수 호출 자체가 안된다.  그래서 다음과 같은 함수들을 만들게 되었다.

그런데 이렇게 사용하다 다시 문제점이 발생했다.

만약 delete 전에 멤버 함수를 호출해야 되는 경우, 어떻게 해야 하는가?

  • 사실 이 문제는 2번째 버전에서 boost::bind 로 처리해도 된다. 하지만 코드 라인이 우아하지 못하다.


여기까지가 내가 겪었던 상황이고, 대처했던 코드들이다. 맛보기 코드에서 모두 다 모아두고, 테스트 코드도 포함 시킨다.

맛보기 코드

여담

  • safe_delete_f(p, f) 에서 f에 boost::bind 로 넣으면, 다 처리 가능하다. 
  • 함수자를 따로 만들지 않은 것은, 함수자가 요구 될 때, boost::bind 를 쓰면 되기 때문이다.
  • boost::checked_delete 를 사용하면, 좀 더 견고해 진다.

:wq

posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. 지나가다.. 2012.01.07 13:03 신고  Addr  Edit/Del  Reply

    리소스 해제는 소멸자에서 해주는게 옳지 않을까 생각이 드네요 ^^;

    그러니까 delete 만해도 리소스가 해제되는게 좋지 않을까요 ㅎㅎ