我有一个非常奇怪的问题,我已经花了好几个小时的时间来解决这个问题:
如果对我正在使用的软件进行错误输入,我可能会产生异常(这当然是有意为之)。这工作正常,我在执行程序时看到一条正确的错误消息。 但是,当我通过 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/