[완료] boost 의 boost/checked_delete.hpp 내부에서 쓸때없는 행동을 합니다.
글쓴이: ikpil / 작성시간: 금, 2009/01/09 - 9:38오후
boost/checked_delete.hpp 중에서.. 다음 함수가 있습니다.
template<class T> inline void checked_delete(T * x) { // intentionally complex - simplification causes regressions typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete x; }
.. 왜 이렇게 할까요? 영문 주석을 봐도, 모하는 행동인지 도무지 이해가 가지 않습니다.
Forums:
boost 문서화의 설명을
boost 문서화의 설명을 찾아 보시는 게 차라리 나을 것 같습니다. 다음은 조금 더 자세한 설명입니다:
두번째 줄은 첫번째 줄이 사라지지 않게 하기 위한 꼼수입니다. 이렇게 하지 않으면 첫번째 줄이 최적화되면서 사라지겠죠.
첫번째 줄이 사라지지 않아야 하는 이유는 적절한 컴파일 에러를 내기 위함입니다. 특히 forward declaration만 되고 실제 내용은 정의되지 않은 incomplete type을 잡아 내기 위함인데, delete에서는 incomplete type의 포인터도 풀 수 있지만 예를 들어서 가상 소멸자가 "나중에" 선언되거나 할 경우 이런 delete는 의도하지 않은 동작을 할 수 있습니다. 이런 상황을 아예 컴파일 에러로 처리하게 하는 것이 checked_delete의 목적입니다.
본래는 이런 경우 sizeof(T) 자체가 에러가 나야 합니다만... sizeof(T)의 값을 체크하는 것은 아무래도 컴파일러 버그를 둘러 가는 방법 같아 보이네요.
답변 감사합니다.
답변 감사합니다. 이해가 되니, 정말 기분이 좋습니다. 다음에는 boost 문서 부터 보겠습니다.
http://www.ikpil.com
댓글 달기