"删除"是否与多态性一起正常工作?

NPS*_*NPS 3 c++ virtual-destructor

BaseClass * p = new DerivedClass();
delete p;
Run Code Online (Sandbox Code Playgroud)

我知道第二行将调用基类的析构函数,如果它没有虚拟析构函数和派生类的析构函数,如果它有,但会delete正确释放内存(让我们说BaseClass's对象占用8个字节的空间,DerivedClass一个12 - 它会释放8或12个字节)并在任何一种情况下摆脱对象?

Jos*_*eld 5

好吧,如果它有一个virtual析构函数,当然会破坏对象,并按预期释放内存.如果它没有virtual析构函数,则行为未定义.

如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.

因此,试图判断内存是否将被完全解除分配并没有任何意义.该程序可以随心所欲地做任何事情.