假设我们有以下虚拟继承:
struct B {
~B() {}
};
struct C : virtual B {
~C() {}
};
现在,为什么在销毁由std::unique_ptr<B>(new C());
创建的向上指针时会崩溃?
注意:如果B::~B()
被声明为virtual
,那么一切正常。
答案 0 :(得分:2)
继承是否为虚拟,它是通过指向基类类型的指针删除派生类对象的未定义行为,除非基类具有虚拟析构函数。那是std::unique_ptr<B>
的作用 - 它有一个静态类型的删除器,它会在delete
指针上调用B*
。
正如你所说,它可以与虚拟析构函数一起使用,因此这样的删除变得很明确。它也可以使用shared_ptr
而不是unique_ptr
正常工作,因为它具有基于它初始化的指针类型的动态删除器,所以当使用new C()
初始化时,它将调用{{1}在delete
指针上。