c++ - SIGABRT 试图抛出异常时

标签 c++ exception virtual-functions

我有一个非常奇怪的问题,我已经花了好几个小时的时间来解决这个问题:

如果对我正在使用的软件进行错误输入,我可能会产生异常(这当然是有意为之)。这工作正常,我在执行程序时看到一条正确的错误消息。 但是,当我通过 API 传递完全相同的输入(产生几乎相同的控制流)时,程序崩溃了。通过调试,我看到以下内容(我使用 gdb 进行调试):

  • Exception 类(在本例中称为 UserExcption,此类没有虚方法,而且它的前身也没有任何虚方法)成功实例化。
  • 当我“进入 throw 语句”时(想说我只是在实例化异常对象后继续执行),我得到以下输出:

(gdb) s

pure virtual method called

Program received signal SIGABRT, Aborted.

0x00007fff95c64ce2 in __pthread_kill ()

(gdb)

我真的不明白这里发生了什么。由于现在涉及所有虚拟方法(据我所知),我也无法想象会有一些悬空指针或类似的东西(否则我希望得到一个空指针异常)。由于整个程序非常大,我不知道在哪里寻找问题,所以我也无法重现它。

有谁知道这种行为的根源是什么?

最好的马库斯

最佳答案

我想知道您是否正在从构造函数或析构函数中调用某些(非纯)虚方法,或者可能某些转换出错了。我猜你应该在你的异常类中检查它,因为你在抛出它的一个实例时得到了错误。

事实上,编译器会阻止你拥有一个没有实现纯虚函数的类。另一方面,虚函数多态性在构造函数和析构函数中并不完全安全。

只是一个建议,但没有看到代码,这只是一个假设。

我也会做一个干净的构建,也许你出于某种原因有一些陈旧的对象。

关于c++ - SIGABRT 试图抛出异常时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6478191/

相关文章:

c++ - std::vector 迭代器类型和允许的操作

c++ - 为什么 DLL 没有复制到输出目录? C++ Visual Studio

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

c++ - 如何在标准C++中使用计算机Gotos将动态调度速度提高20%

c++ - 具有自动存储持续时间的虚拟功能似乎不起作用

c++ - 匿名命名空间和单一定义规则

c++ - 如果我将右值分配给类的对象,类的指针成员会发生什么情况?

java - 从整数中删除字符

java - try catch 将名称拆分为第一个和最后一个的异常

c++ - 使用虚方法的具体案例