이 포스트의 목적
- 구현한 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
참조 링크
- http://www.gpgstudy.com/forum/viewtopic.php?p=21353 - 2005년도 글..
참조 인물
- 김문순
내용
내가 처음 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
'연구실 > 파편화된 기록들' 카테고리의 다른 글
중복 코드 제거 기법 - swith+for 코드 점프 기법 (0) | 2011.03.18 |
---|---|
lunit - Unit Testing Framework for Lua (1) | 2011.02.27 |
ORA-12520 (2) | 2011.02.05 |
루아(lua) 변수 범위, C 와 다른 체계를 쓴다. (0) | 2010.12.23 |
C/C++ 전처리 매크로(Predefined Macros) __DATE__, __TIME_ 값을 정수로 바꾸기 (0) | 2010.12.09 |
C++ 에서 템플릿 인자 추론에 대한 고찰 문제 (0) | 2010.11.08 |
10진 정수를 헥사 코드, 헥스 코드, hex code 문자열로 만드는 방법 (0) | 2010.10.14 |
리눅스 컴파일 환경 구축하기 - Debian 편 (0) | 2010.10.12 |
소멸자로 객체를 초기화 하는 작업은 무척 위험하다. (2) | 2010.07.31 |
C++ 비가상 함수를 상속 클래스가 재정의 했을 경우 (4) | 2010.07.13 |
최근댓글