Delete objects of incomplete type

前端 未结 3 2007
孤街浪徒
孤街浪徒 2020-12-06 16:02

This one made me think:

class X;

void foo(X* p)
{
    delete p;
}

How can we possibly delete p if we do not even know whether

相关标签:
3条回答
  • 2020-12-06 16:42

    It is undefined behavior.

    However, you can make the compiler check for incomplete types, like boost:

    // verify that types are complete for increased safety
    
    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;
    }
    

    Applying sizeof to an incomplete type should trigger an error, and I suppose if that passes with some compiler, then an array of negative size would trigger an error.

    0 讨论(0)
  • 2020-12-06 16:51

    From the standard [expr.delete]:

    If the object being deleted has incomplete class type at the point of deletion and the complete class has a non-trivial destructor or a deallocation function, the behavior is undefined.

    So, it's UB if there's nontrivial stuff to do, and it's ok if there isn't. Warnings aren't neccessary for UB.

    0 讨论(0)
  • 2020-12-06 17:01

    It is undefined behaviour, and a common gotcha when implementing the pImpl pattern. To the best of my knowledge, there is simply no such thing as a warning that the compiler is required to emit. Warnings are elective; they're there because the compiler writer thought they would be useful.

    0 讨论(0)
提交回复
热议问题