堆栈跟踪中“纯虚拟”调用的含义是什么?

我的服务崩溃了,我有这个堆栈跟踪。 我无法从这里推断出任何东西

00007f859cd27834 __gnu_cxx::__verbose_terminate_handler() @ 00007f859cd25865 __cxxabiv1::__terminate(void (*)()) @ 00007f859cd25892 std::terminate() @ 00007f859cd263be __cxa_pure_virtual @ 0000000001996f9f My::Class::~Class() 

有人可以帮忙吗?

如果实际调用了“纯虚拟”函数,则会发生这种情况,从而导致崩溃。

纯虚函数是声明的函数:

 virtual void pureVirtualFunction() = 0; 

通常编译器会检测您是否省略了实现纯虚函数。 但是可能会出现这样的情况。

在Base构造函数中调用纯虚函数

其中一个常见问题是来自类的基础构造函数的函数调用:

 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 MyClassPtr; 

这样的共享指针的对象可以在很多地方被销毁,但编译器缺少如何调用类的解构函数所需的信息。 确保你阅读了编译器的所有警告 ,它会警告这个问题(以及调用纯虚方法的许多其他问题。)

对于这种特殊情况,请确保避免使用共享指针的前向声明,并仅将它们包含在类声明中(如果可能)。

另见这个答案 。

或者更有可能:

 virtual ~Class () = 0; 

这声明了一个虚拟析构函数,并告诉编译器在析构函数的vtable中腾出空间。 但由于没有定义,GCC在vtable中插入了对__cxa_pure_virtual的调用。

当你没有为~Class()定义一个主体或者未能在派生类中显式地写一个主体时,你在销毁时调用了__cxa_pure_virtual。

尝试实例化抽象类时,您应该收到某种警告或错误。

在堆栈中稍微向上看可能实际上提供了关于问题的更多证据。 和代码示例演示如何使用该类可能会有用。