Boost::checked delete
type_must_be_complete
boost/checked_delete.hpp
내부의 type_must_be_complete
의 의미는?
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;
}
두번째 줄은 첫번째 줄이 사라지지 않게 하기 위한 꼼수입니다. 이렇게 하지 않으면 첫번째 줄이 최적화되면서 사라지겠죠.
첫번째 줄이 사라지지 않아야 하는 이유는 적절한 컴파일 에러를 내기 위함입니다. 특히 forward declaration만 되고 실제 내용은 정의되지 않은 incomplete type을 잡아 내기 위함인데, delete에서는 incomplete type의 포인터도 풀 수 있지만 예를 들어서 가상 소멸자가 "나중에" 선언되거나 할 경우 이런 delete는 의도하지 않은 동작을 할 수 있습니다. 이런 상황을 아예 컴파일 에러로 처리하게 하는 것이 checked_delete의 목적입니다.
본래는 이런 경우 sizeof(T) 자체가 에러가 나야 합니다만. sizeof(T)의 값을 체크하는 것은 아무래도 컴파일러 버그를 둘러 가는 방법 같아 보이네요.