没有虚拟析构函数的虚拟继承的Segfault

时间:2015-03-24 08:56:40

标签: c++ virtual-inheritance

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

struct B {
    ~B() {}
};

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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