我的服务崩溃了,我有这个堆栈跟踪。我无法从这里推断出任何东西
00007f859cd27834 __gnu_cxx::__verbose_terminate_handler()
@ 00007f859cd25865 __cxxabiv1::__terminate(void (*)())
@ 00007f859cd25892 std::terminate()
@ 00007f859cd263be __cxa_pure_virtual
@ 0000000001996f9f My::Class::~Class()
有人可以帮忙吗?
答案 0 :(得分:8)
如果实际调用了“纯虚拟”函数,则会发生这种情况,从而导致崩溃。
纯虚函数是声明的函数:
virtual void pureVirtualFunction() = 0;
通常编译器会检测您是否省略了实现纯虚函数。但有可能出现这样的情况。
常见问题之一是来自类的基本构造函数的函数调用:
MyClass::MyClass() {
pureVirtualFunction(); // Call of pure virtual function from base constructor.
}
或者从基类的解构器调用纯虚方法:
MyClass::~MyClass() {
pureVirtualFunction(); // Call of pure virtual function from base deconstructor.
}
如果您使用这样的前向声明,还有另一种常见情况:
class MyClass;
typedef std::shared_ptr<MyClass> MyClassPtr;
这样的共享指针的对象可以在很多地方被销毁,但编译器缺少如何调用类的解构函数所需的信息。确保你阅读编译器的所有警告,它会警告这个问题(以及调用纯虚方法的许多其他问题。)
对于这种特殊情况,请确保避免使用共享指针的前向声明,并仅将它们包含在类声明中(如果可能)。
另见answer。
答案 1 :(得分:3)
或更有可能:
virtual ~Class () = 0;
这声明了一个虚拟析构函数,并告诉编译器在析构函数的vtable中腾出空间。但由于没有定义,GCC在vtable中插入了对__cxa_pure_virtual的调用。
如果你没有为~Class()定义一个主体,或者未能在派生类中显式地编写一个主体,则在销毁时调用__cxa_pure_virtual。
尝试实例化抽象类时,您应该收到某种警告或错误。
在堆栈中稍微向上看可能实际上提供了更多关于问题的证据。和代码示例演示如何使用该类可能会有用。