在destrction期间未定义的行为?

时间:2015-04-25 05:56:21

标签: c++ destruction

让我们考虑以下代码:

#include <iostream>

struct A{ virtual void foo(){ } };

struct B : A { virtual void foo(){ } };

A *a = new B;


int main()
{
    delete a; //UB?
}

我故意没有定义虚拟析构函数。编译器打印了一条关于导致UB的消息,是真的吗?

1 个答案:

答案 0 :(得分:5)

如果你通过指向T的指针删除了正式的UB,这不是最派生的类型,并且T没有虚拟的析构函数。

在实践中,如果你没有任何数据队员,你可以逃脱它,但它仍然是非常不好的和不必要的练习。

注意:当你使用shared_ptr时,它会在初始化时创建一个删除函数,并且删除函数可以记住原始类型,如果该类型是派生类型最多,则确保定义良好删除。例如。在您的情况下shared_ptr<A> p( new B );就可以了。