2011-11-12 32 views
8

這個錯誤讓我困擾了兩天:當運行代碼時,我有一個運行時錯誤「終止調用時沒有活動異常」\ n中止「,爲什麼?以下運行時錯誤意味着什麼:「終止調用時沒有發生活動異常 n中止」

我嘗試找到代碼並找到可能退出代碼「xx = new int [num]」的代碼,我的測試用例中的num大約是640000(新的64MB內存)。當我把num設置得小得多爲10時,這是可以的,但是這次我的代碼得到了錯誤的答案。

我嘗試刪除所有「try/catch」子句,但仍然存在此錯誤。

另外我//所有調用「xx = new int [num]」子句的函數,錯誤依然存在,這次我找到的代碼可能退出是一個正常的「for循環」。

所有的情況通過了編譯器,你有沒有遇到過這個錯誤在運行你的代碼?謝謝!

我//刪除一些條款,並得到以下錯誤: * glibc的檢測* ./ESMF_RegridWeightGen:munmap_chunk():無效的指針:0x00000000005cd376 *

+1

嘗試把一個'試/ catch'阻擋在你的整個'main'身體,看看如果有任何例外... –

+0

你有一個小代碼示例來演示這個問題嗎? –

+0

你有多個線程嗎? – neagoegab

回答

4

的 「終止不活躍異常」消息是一個暗示,在你的程序的某個時刻,異常處理被破壞了。

內存分配可能是主要原因,但可能不是錯誤網站。大的分配會拋出一個std :: bad_alloc異常,並且這個異常在某處被錯誤地處理。

爲了驗證理論,插入像

throw std::logic_error("Foo"); 

分配上方的線,這應當觸發錯誤也是如此。

我遇到兩個常見原因如下:

  • 多線程程序的MinGW如果沒有合適的標誌編譯
  • 被調用的棧展開過程的一部分,析構函數發生異常

您應該能夠使用調試器診斷後一種情況。應用程序的堆棧跟蹤(例如,通過在gdb中運行獲得)應該會有很大的幫助。

+0

約2.5GB的配置? 640000 * sizeof(int) – neagoegab

+2

@neagoegab:我上次檢查sizeof(int)<10,因此640,000 * sizeof(int)<6,400,000 <6,4 MB。它可能太大,可能會拋出一個std :: bad_alloc。在最壞的情況下,這應該導致打印std :: bad_alloc的終止調用,而不是在「沒有活動異常時調用終止」。某個地方存在更糟糕的問題,他的分配太大,只是觸發它。 – thiton

+0

是的,你是對的 – neagoegab

7

我試過用throw的時候遇到過這個;在catch子句之外。重新拋出失敗並顯示錯誤消息。

+0

謝謝,現在救了我。 – Etherealone

18

當我看到這個錯誤時,它是由線程對象在它封裝的線程退出之前破壞引起的。

+1

它可能與線程無關。你可能在本地塊中有'std :: thread foo(...)',並在啓動線程後拋出一個異常。在你的異常被捕獲之前,線程析構函數會發生,並調用'std :: terminate()',這很難調試真正的異常! –

1

使用MinGW,向gcc添加-mthreads編譯器選項可解決此問題。

the gcc manual

-mthreads

上MINGW32

支持線程安全的異常處理。依賴線程安全異常處理的代碼必須使用-mthreads選項編譯並鏈接所有代碼。編譯時,-mthreads定義了-D_MT;當鏈接時,它鏈接在一個特殊的線程助手庫-lmingwthrd中,它清理每個線程的異常處理數據。

2

像Gearoid墨菲說,當線程函數本身已經完全執行之前線程對象被破壞發生錯誤。

前:

#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 
} 

後:我使用tinythread庫(http://tinythreadpp.bitsnbites.eu/)檢測到該錯誤

#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. 
} 
相關問題