SIGABRT在尝试抛出异常时

时间:2011-06-25 13:58:15

标签: c++ exception-handling virtual-functions

我有一个非常奇怪的问题,我已经花了好几个小时的注意力了:

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

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

(gdb)s

     

名为

的纯虚方法      

编程接收信号SIGABRT,已中止。

     __pthread_kill()

中的

0x00007fff95c64ce2      

(gdb)

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

有没有人知道这种行为的来源是什么?

最佳马库斯

1 个答案:

答案 0 :(得分:2)

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

实际上,编译器会阻止您使用未实现纯虚函数的类。另一方面,虚函数多态在构造函数和析构函数中并不完全安全。

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

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