C++ - 자주 사용하는 C++ 이디엄(idiom) cheked delete

규격에 의해 delete식에 의해 불완전 타입을 delete에 넘기는 것이 허가되고 있다.
그러나 trival 생성자가 아닌지, 독자적인 delete 연산자를 정의하고 있는 경우 미 정의 동작이 된다.
미정의 동작은 좋지 않으므로 delete 대상 형식이 불완전 타입인 경우 컴파일러에 에러를 내자는 idiom 이다.

template <class T>
inline void cheked_delete(T*& p)
{
    typedef char type[sizeof(T)?1:-1];
    (void)sizeof(type);    
    delete p;
    p=nullptr;
}

불완전 타입을 받았을 때 배열의 요소 수를 음수로 하고 typedef 하기 때문에 에러가 되게 한다는 방법이다.

#include <boost/utility.hpp>

class Hoge;
Hoge* CreateHoge();

int main()
{
    Hoge* ptr = CreateHoge();

    ...

    boost::checked_delete( ptr ); // 여기에서 컴파일 에러

    return 0;
}

이 글은 2020-05-28에 작성되었습니다.