2011-07-01 14 views
1

このバイナリはstd:string型の例外をスローすることによってクラッシュします。剥奪バイナリから'std :: string'のインスタンスをスローした後にterminateが呼び出される

スタックトレース:

terminate called after throwing an instance of 'std::string' 
*** Aborted at 1309483487 (unix time) try "date -d @1309483487" if you are using GNU date *** 
PC: @  0x3fb0c30155 (unknown) 
*** SIGABRT (@0xd54) received by PID 3412 (TID 0x40d03940) from PID 3412; stack trace: *** 
    @  0x3fb180de70 (unknown) 
    @  0x3fb0c30155 (unknown) 
    @  0x3fb0c31bf0 (unknown) 
    @  0x2aaaaab80cc4 (unknown) 
    @  0x2aaaaab7ee36 (unknown) 
    @  0x2aaaaab7ee63 (unknown) 
    @  0x2aaaaab7ef4a (unknown) 
    @   0x4c2622 XYZ::connect() 
    @   0x4c3e0f XYZ::refresh() 
    @  0x3fb18062f7 (unknown) 
    @  0x3fb0cd1e3d (unknown) 

は今の事はある、リフレッシュ()関数は、のstd ::文字列をキャッチしようとしません。それは次のようになります: -

bool XYZ::refresh() { 
    try { 
    connect(); 
    } catch (string& s) { 
    return false; 
    } 
    return true; 
} 

なぜそれがキャッチされていないのですか?または私は間違ってスタックトレースを読んでいますか?

+3

私は 'const string 'をキャッチしようとします。 –

答えて

0

これはshould be fineです。

おそらく、すべてソースファイルを再構築しなかったか、または古い実行可能ファイルを実行している可能性があります。

4

おそらく一部またはすべてのモジュールが-fno-exceptionsでコンパイルされましたか?どのように例外の動作が変わるかについては、http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.htmlを参照してください。

たとえば、次の短いプログラムは"terminate called after throwing an instance of 'std::string'"を表示:foo()を含むモジュールを-fno-exceptionsでコンパイル、および

  • foo()タイプstd::stringの例外をスローするもの(他のすべてのモジュールを呼び出した

    • -fexceptionsで集計)

      #include <string> 
      #include <iostream> 
      
      using namespace std; 
      
      int foo(); 
      
      int main() 
      { 
          try { 
           foo(); 
          } 
          catch (string& s) { 
           std::cout << "caught it: \"" << s << "\"" << endl; 
          } 
      
          return 0; 
      } 
      

    注私は単に-fexceptions(G ++のデフォルト)でfoo.cppを再コンパイルと再リンクすると、プログラムが表示されていること:

    caught it: "the string exception" 
    

    予想通り。


    それとも何らかの中間機能はstd::stringが表示されませんでしたスロー仕様を持っていましたか?例えば

    、このプログラム:

    #include <string> 
    #include <iostream> 
    
    using namespace std; 
    
    int Hunc() throw(int); // can only throw int (?) 
    
    int main() 
    { 
        try { 
         Hunc(); 
        } 
        catch (string& s) { 
         std::cout << "caught it: \"" << s << "\"" << endl; 
        } 
    
        return 0; 
    } 
    
    
    int Hunc() throw(int) 
    { 
        throw string("the string exception"); 
    } 
    

    はまた " 'のstd ::文字列' のインスタンスを投げた後に呼び出さに終了" 表示されます。どちらの例もMinGW 4.5.1のWindowsボックスでテストされています。

  • 関連する問題