Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有虚拟析构函数的虚拟继承上的Segfault_C++_Virtual Inheritance - Fatal编程技术网

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

C++ 没有虚拟析构函数的虚拟继承上的Segfault,c++,virtual-inheritance,C++,Virtual Inheritance,假设我们有以下虚拟继承: struct B { ~B() {} }; struct C : virtual B { ~C() {} }; 现在,为什么它会在销毁由std::unique_ptr(new C())创建的上溯指针时崩溃 注意:如果B::~B()声明为virtual,则一切正常。无论继承是否为虚拟继承,通过指向基类类型的指针删除派生类对象都是未定义的行为,除非基类具有虚拟析构函数。这就是std::unique\u ptr所做的-它有一个静态类型的deleter,在B*指

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

struct B {
    ~B() {}
};

struct C : virtual B {
  ~C() {}
};
现在,为什么它会在销毁由
std::unique_ptr(new C())创建的上溯指针时崩溃


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

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


正如您所说的,它可以与虚拟析构函数一起工作,这样就可以很好地定义这样的删除。使用
shared_ptr
而不是
unique_ptr
,它也可以正常工作,因为它有一个基于初始化时使用的指针类型的动态删除器,所以当使用
new C()初始化时
它将在
C*
指针上调用
delete

因为这是一种未定义的行为,所以我会假设如果没有虚拟函数,您将无法获得虚拟继承所需的vtable。谢谢,这就是我一直在寻找的答案。:)所以拥有
struct C:B
也会导致未定义的行为,对吗?我想我试过了,但被虚拟继承弄糊涂了,因为w/o至少不会崩溃(用Visual C++编译)。@Xlea:是的,你仍然会有UB和非虚拟继承。它可能不太可能崩溃,更可能只是让对象处于未完全破坏的状态,但仍然未定义。