我偶尔会收到此错误
pure virtual method called
terminate called without an active exception
Run Code Online (Sandbox Code Playgroud)
我在代码中添加了一些 try/catch 块,但是有一些工具可以帮助捕获此错误吗?
valgrind 在我的情况下不可用,因为这是一个具有高内存使用率的高速编码器,因此它需要永远运行。
任何提示或线索都将受到欢迎。
可能的原因是您在构造函数或析构函数中调用虚拟成员函数,而虚拟函数调用尚不起作用。这是因为:
例如:
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)