Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试抛出异常时发出SIGABRT_C++_Exception Handling_Virtual Functions - Fatal编程技术网

C++ 尝试抛出异常时发出SIGABRT

C++ 尝试抛出异常时发出SIGABRT,c++,exception-handling,virtual-functions,C++,Exception Handling,Virtual Functions,我有一个非常奇怪的问题,我花了好几个小时才注意到: 如果对我正在使用的软件输入错误,我可以生成一个异常(这当然是有意的)。这很好,我在执行程序时看到了正确的错误消息。 但是,当我通过API传递完全相同的输入时(产生几乎相同的控制流),程序崩溃。通过调试,我看到以下内容(我使用gdb进行调试): 异常类(在本例中称为userexption,该类没有任何虚拟方法,其前辈也没有任何虚拟方法)已成功实例化 当我单步执行“throw语句”(我想说的是,我只是在异常对象实例化后继续单步执行)时,我得到以下

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

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

  • 异常类(在本例中称为userexption,该类没有任何虚拟方法,其前辈也没有任何虚拟方法)已成功实例化
  • 当我单步执行“throw语句”(我想说的是,我只是在异常对象实例化后继续单步执行)时,我得到以下输出:
(gdb)s

纯虚拟方法调用

程序收到信号SIGABRT,中止

0x00007fff95c64ce2位于线程终止()

(gdb)

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

有人知道这种行为的根源是什么吗


Best Markus

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

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

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


我还将创建一个干净的构建,可能出于某种原因您有一些过时的对象。

-两个堆栈(包括throw语句之前和之后的堆栈)您是否在
zorba::UDFunctionCallIteratorState::~UDFunctionCallIteratorState
中有虚拟调用?或者实例
UDFunctionCallIteratorState
的悬空指针检查
zorba::http_client::general\u evaluate
函数的try块中的局部变量。没有发现任何异常,但正如sergio I所建议的那样我尝试了一个干净的构建,这不知怎么解决了问题。我现在创建了一个干净的构建,这解决了问题!!我不明白-这是什么地方的虫子吗?(就像我们的构建系统、cmake甚至编译器/链接器)。你知道这是怎么发生的吗?无论如何:谢谢你的回答!我认为这与某些编译器/链接器优化走错了方向有关。原则上,这根本不应该发生;尽管它发生了。