这个错误让我感到困扰了大约两天:当运行代码时,我遇到了一个运行时错误:“在没有活动异常的情况下调用终止\ n Aborted”,为什么?
我尝试找到代码并找到该行可能会退出代码“xx = new int [num]”,我的测试用例中的num约为640000(64MB内存为新)。当我将num设置为10更小时,没关系,但这次我的代码得到了错误的答案。
我尝试删除所有“try / catch”条款,但仍然有此错误。
另外我//调用“xx = new int [num]”子句的所有函数,错误仍然存在,而这次我找到的代码可能会退出正常的“for循环”。
所有案例都通过了编译器,你在运行代码时遇到过这个错误吗?谢谢!
我//删除一些子句并得到以下错误: 检测到 * glibc * ./ESMF_RegridWeightGen:munmap_chunk():指针无效:0x00000000005cd376 *
答案 0 :(得分:19)
当我看到这个错误时,它是由线程对象解构引起的,在它封装的线程退出之前。
答案 1 :(得分:7)
当我尝试使用throw时遇到了这个;在catch条款之外。重新抛出失败,并显示错误消息。
答案 2 :(得分:4)
“没有活动异常终止”消息提示,在程序中的某个时刻,异常处理已被破坏。
内存分配可能是主要原因,但可能不是错误站点。大型分配将抛出std :: bad_alloc异常,并且在某处错误地处理此异常。
要验证理论,请插入一行
throw std::logic_error("Foo");
在分配之上,这也应该触发错误。
我遇到了两个常见的原因:
您应该能够使用调试器诊断后一种情况。应用程序的堆栈跟踪(例如通过在gdb中运行获得)应该会有很大帮助。
答案 3 :(得分:2)
与Gearoid一样,Murphy表示,在线程函数本身完全执行之前,线程对象被破坏时会发生错误。我使用tinythread库(http://tinythreadpp.bitsnbites.eu/)检测到此错误:
在:
#include "tinythread.h"
...
void fork_thread(void (*function_pointer)(void * arg), void * arg_pointer) {
tthread::thread t(function_pointer, arg_pointer);
// t is destructed here, causing the "terminate called ..." error
}
后:
#include "tinythread.h"
...
void fork_thread(void (*function_pointer)(void * arg), void * arg_pointer) {
tthread::thread * t = new tthread::thread(function_pointer, arg_pointer);
// now the new thread object is not destructed here, preventing
// the "terminate called ..." error. Remember that because thread
// object must now be destructed explicitly (i.e. manually) with delete
// call you should store the pointer t to a vector of thread pointers
// for example.
}
答案 4 :(得分:1)
使用MinGW,将-mthreads
编译器选项添加到gcc可以解决此问题。
-mthreads
支持Mingw32上的线程安全异常处理。依赖于线程安全异常处理的代码必须使用-mthreads选项编译和链接所有代码。编译时,-mthreads定义-D_MT;链接时,它链接在一个特殊的线程帮助库-lmingwthrd中,它清理每个线程的异常处理数据。