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