以下运行时错误意味着什么:"在没有活动异常的情况下终止调用\n已中止"

xun*_*ang 9 c++ try-catch

这个错误让我感到困扰了大约两天:当运行代码时,我有一个运行时错误"终止被调用而没有活动异常\n已中止",为什么?

我尝试找到代码并找到该行可能退出代码"xx = new int [num]",我的测试用例中的num约为640000(64MB内存为新).当我将num设置为小得多为10时,没关系,但这次我的代码得到了错误的答案.

我尝试删除所有"try/catch"子句但仍然有此错误.

另外我//所有调用"xx = new int [num]"子句的函数,错误仍然存​​在,而这次我找到的代码可能退出是一个正常的"for循环".

所有情况都通过了编译器,你在运行代码时遇到过这个错误吗?谢谢!

我//一些删除子句并得到以下错误: *检测到glibc* ./ESMF_RegridWeightGen:munmap_chunk():无效指针:0x00000000005cd376 *

Gea*_*phy 18

当我看到这个错误时,它是由线程对象在它封装的线程退出之前进行破坏引起的.


小智 7

当我尝试使用throw时遇到了这个; 在catch条款之外.重新抛出失败并显示该错误消息.


thi*_*ton 4

“在没有活动异常的情况下终止”消息暗示,在程序中的某个时刻,异常处理被破坏了。

内存分配可能是主要原因,但可能不是错误站点。大分配会抛出 std::bad_alloc 异常,并且该异常在某处被错误处理。

要验证该理论,请插入类似以下的行

 throw std::logic_error("Foo");
Run Code Online (Sandbox Code Playgroud)

高于分配,这也应该触发该错误。

我遇到过两个常见的原因:

  • 没有正确标志编译的多线程 mingw 程序
  • 作为堆栈展开过程的一部分调用的析构函数引发了异常

您应该能够使用调试器诊断后一种情况。应用程序的堆栈跟踪(例如通过在 gdb 中运行它获得的)应该会有很大帮助。

  • @neagoegab:上次我检查时,sizeof(int) < 10,所以 640,000 * sizeof(int) < 6,400,000 < 6,4 MB。它可能太大并且可能抛出 std::bad_alloc。在最坏的情况下,这应该导致打印 std::bad_alloc 的终止调用,而不是“在没有活动异常的情况下调用终止”。某个地方有一个更严重的问题,而他的分配太大只是触发了这个问题。 (2认同)