没有虚拟析构函数的虚拟继承的段错误

Segfault on virtual inheritance without virtual destructor

假设我们有以下虚拟继承:

struct B {
    ~B() {}
};

struct C : virtual B {
  ~C() {}
};

现在,为什么它会在销毁由 std::unique_ptr<B>(new C()); 创建的向上转型指针时崩溃?

注意:如果声明 B::~B() virtual,那么一切正常。

无论继承是否为虚拟,通过指向基 class 类型的指针删除派生 class 对象是未定义的行为,除非基 class 具有虚拟析构函数。这就是 std::unique_ptr<B> 所做的——它有一个静态类型的删除器,它在 B* 指针上调用 delete

如您所说,它可以与虚拟析构函数一起正常工作,因此这种删除变得明确。使用 shared_ptr 而不是 unique_ptr 也能正常工作,因为它有一个基于指针类型的动态删除器,所以当用 new C() 初始化时,它将调用 deleteC* 指针上。