在某些情况下,使用std :: set_terminate无法捕获C ++纯虚函数调用吗?

永久性

在Linux服务器上运行的可执行文件的深处,有一个C ++纯虚拟函数调用。这会导致服务器崩溃,不留下程序跟踪数据,堆栈跟踪和核心转储。仅保留一些日志文件。几乎可以肯定,这是由一生的问题引起的,我很清楚发生的地方,但我想证明一下。我试图通过使用std::set_terminate设置将在调用终止时运行的处理程序来纠正这种情况这在测试中有效。例如,如果我引起一个纯虚拟呼叫,请使用:

class Base {
public:
    Base() {}
    virtual ~Base(){}
    virtual void foo() = 0;
};

class Derived: public Base {
public:
    Derived(): n_(0) {}
    ~Derived(){}
    void foo() {
            n_ = 1;
    }
private:
    int n_;
};              

接着

Base* p = new Derived();
Base* p1 = p;
p->~Base();
p1->foo();

处理程序工作并生成跟踪数据,堆栈跟踪和核心转储。运行系统打印

纯虚拟方法称为

对于这个测试。

set_terminate代码中没有其他调用该测试是在服务器启动并运行时完成的,因此如果可能的话,任何后续的调用都可能已经使我的处理程序陷入混乱。然而,在实际的服务器,这并没有赶上纯虚拟呼叫。我能想到的唯一情况可能会导致这是在我的调用之后设置终止处理程序。还有什么其他方法可以避免我的终止处理程序?

重复数据删除器

实际上,如果您具有Undefined Behavior,则对执行环境或编译的二进制文件的任何更改都可能导致您的代码以其他方式出现异常。

在更改了优化和调试标志的情况下,这一点尤其明显,但是似乎无害的代码更改也被预定义为触发此操作。

接下来,您的错误是否可能是heisenbug,即与计时/多线程相关?

此外,如果在构造/销毁过程中不需要虚拟表并且实际上没有创建过确切类型的对象,则编译器可能会完全省略虚拟表。
因此,即使析构函数已运行,您对的调用也foo可能同样崩溃或调用derived::foo

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

DLL的std :: set_terminate吗?

C ++ Lambda函数调用纯虚函数

在某些情况下,为什么std :: begin在C ++ 14中不能在C数组上开始使用free函数?

C ++从基类中的非虚函数调用纯虚函数

纯虚函数调用有趣的情况

C ++:通过调用纯虚函数避免重复

使用纯虚函数在C ++类之外定义?

我可以在不使用 Objective-C(纯 Swift)的情况下向 React Native 公开 Swift 函数吗?

如何在不明确限定其名称的情况下调用纯虚函数?

SQL查询在某些情况下无法使用某些时间

为什么在没有类型应用程序的情况下某些函数调用无法工作?

Excel日期错误:Excel无法识别为日期;使用Date =函数会增加2年,但仅在某些情况下

C语言-在某些情况下,我可以使用char在数字旁边切换吗?

C ++:从同一类的成员函数调用纯虚函数

C ++在实现的纯虚方法中自动从父抽象类调用检查方法吗?

C++ 纯虚函数调用不会抛出运行时异常?

覆盖纯虚函数时使用`override`有什么意义吗?

我可以在这种情况下避免使用纯纯虚函数吗?

C ++ 11中的纯虚函数

奇怪的行为C ++纯虚函数

关于纯虚函数的C ++设计原理?

D中的C ++ DLL(纯虚函数)

使用Boost :: Python包装纯虚函数

使用 using 实现纯虚函数

K&R练习6-1在某些情况下,getword函数无法读取EOF

为什么在某些情况下原型函数无法解决“这个”问题?

现代C ++编译器是否可以避免在某些情况下两次调用const函数?

在某些情况下从 subprocess.check_output 调用 grep -c 时回溯

在不停止代码的情况下使用 read() C 函数