如何捕获一个名为错误的纯虚方法?

Jac*_*cko 2 c++ gdb

我偶尔会收到此错误

pure virtual method called
terminate called without an active exception
Run Code Online (Sandbox Code Playgroud)
  1. 在 C++ 中不可能实例化抽象类,那么怎么可能出现这种情况呢?
  2. 我怎样才能追踪这个错误?这里的复杂性在于,一个进程启动一个子进程,因此它可能位于子进程中,也可能位于父进程中。

我在代码中添加了一些 try/catch 块,但是有一些工具可以帮助捕获此错误吗?

valgrind 在我的情况下不可用,因为这是一个具有高内存使用率的高速编码器,因此它需要永远运行。

任何提示或线索都将受到欢迎。

Jan*_*tke 5

可能的原因是您在构造函数或析构函数中调用虚拟成员函数,而虚拟函数调用尚不起作用。这是因为:

  • 在构造函数中,我们还没有构造从我们继承的派生类
  • 在析构函数中,我们已经销毁了从我们继承的派生类

例如:

struct Base {
    Base() { foo(); } // undefined behavior
    virtual void foo() = 0;
};

struct Derived : Base {
    void foo() final {}
}
Run Code Online (Sandbox Code Playgroud)

追踪通话

这通常非常简单,因为编译器通常可以检测到这一点并发出警告:

<source>:2:14: warning: call to pure virtual member function 'foo' has undefined behavior;
                        overrides of 'foo' in subclasses are not available in the
                        constructor of 'Base' [-Wcall-to-pure-virtual-from-ctor-dtor]
    Base() { foo(); }
             ^
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因这不起作用,我们可以Base::foo()使用调试器跟踪对 的调用,并使其在std::terminate调用时停止。break abort在 GDB 中应该可以工作,因为默认情况下std::terminate会调用std::abort

如果这是不可能的,我们可以使用定义一个终止处理程序std::set_terminate并在其中放置一个断点。

如果由于某种原因这不是一个可用的选项(例如 C++98 代码库),我们可以Base::foo()在其中定义并放置一个断点:

void Base::foo() {
    // breakpoint here
}
Run Code Online (Sandbox Code Playgroud)