没有虚拟析构函数的虚拟继承的段错误
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()
初始化时,它将调用 delete
在 C*
指针上。
假设我们有以下虚拟继承:
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()
初始化时,它将调用 delete
在 C*
指针上。