在destrction期间未定义的行为?

2 c++ destruction

我们考虑以下代码:

#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的消息,是真的吗?

Che*_*Alf 5

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

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

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

  • 就个人而言,我认为依靠`std :: shared_ptr`的这种能力是不错的做法. (2认同)