让我们考虑以下代码:
#include <iostream>
struct A{ virtual void foo(){ } };
struct B : A { virtual void foo(){ } };
A *a = new B;
int main()
{
delete a; //UB?
}
我故意没有定义虚拟析构函数。编译器打印了一条关于导致UB的消息,是真的吗?
答案 0 :(得分:5)
如果你通过指向T的指针删除了正式的UB,这不是最派生的类型,并且T没有虚拟的析构函数。
在实践中,如果你没有任何数据队员,你可以逃脱它,但它仍然是非常不好的和不必要的练习。
注意:当你使用shared_ptr
时,它会在初始化时创建一个删除函数,并且删除函数可以记住原始类型,如果该类型是派生类型最多,则确保定义良好删除。例如。在您的情况下shared_ptr<A> p( new B );
就可以了。