2011-11-12 7 views
8

このコードでは、実行中のエラーが「アクティブな例外なしで呼び出されました。 "、なぜ?以下のランタイムエラーの意味:「アクティブな例外なしで呼び出されたターミネーション nアボート」

私はコードを見つけようとしましたが、行が "xx = new int [num]"というコードを終了することがあります。テストケースのnumは約640000(64MBのメモリを新しいもの)です。 numを10に設定すると、それは問題ありませんが、今回は間違った答えが返ってきます。

"try/catch"句をすべて削除しようとしましたが、このエラーはまだあります。

また、 "xx = new int [num]"節を呼び出すすべての関数はエラーが存在し、コードが終了することがあります。

すべてのケースがコンパイラに渡されました。コード実行時にこのエラーが発生しましたか?ありがとうございます。

私はいくつかの削除句を//と下のエラーを取得: "アクティブ例外なく終了" 0x00000000005cd376 *

+1

あなたの全体 'main'体の周りに'てみてください/ catch'ブロックを入れてみてくださいと見ます例外がすべてある場合は... –

+0

問題を示す小さなコードサンプルがありますか? –

+0

複数のスレッドがありますか? – neagoegab

答えて

4

:* glibcの検出* ./ESMF_RegridWeightGen:munmap_chunk():無効なポインタをメッセージは、プログラムのある時点で例外処理が壊れているというヒントです。

おそらくメモリー割り当てが主な原因ですが、おそらくエラーサイトではありません。大きな割り当てはstd :: bad_alloc例外をスローし、この例外は間違ってどこかで処理されます。

割り当て上記

throw std::logic_error("Foo"); 

のような行を挿入し、理論を検証するには、これは同様のバグを誘発する必要があります。私はこのための2つの一般的な原因が発生しました

  • マルチスレッドの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では、-mthreadsコンパイラオプションをgccに追加することでこの問題が解決されます。the gcc manualから

    -mthreads

    MINGW32上

    サポートスレッドセーフな例外処理。スレッドセーフな例外処理に依存するコードは、すべてのコードをコンパイルし、-mthreadsオプションでリンクする必要があります。コンパイル時に、-mthreadsは-D_MTを定義します。リンクすると、スレッドごとの例外処理データをクリーンアップする特別なスレッドヘルパーライブラリ-lmingwthrdにリンクします。 Gearoidマーフィー同様

    2

    は、スレッドオブジェクトは、それ自体が完全に実行されたスレッド関数の前に破壊されたときにエラーが発生したと述べました。私は(http://tinythreadpp.bitsnbites.eu/)tinythreadライブラリを使用して、このエラーを検出:

    前:

    #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. 
    } 
    
    関連する問題