2017-01-20 8 views
0

は、ここで最小の例である:未処理の例外によってセグメンテーションフォルトが発生するのはなぜですか?

[[email protected] various] (master *)$ cat throw.cpp 

#include <iostream> 


int main(int argc, char* argv[]) 
{ 
    throw("pouet pouet"); 
} 

[[email protected] various] (master *)$ ./a.out 
terminate called after throwing an instance of 'char const*' 
Aborted (core dumped) 

ドキュメントを読んで、デフォルトのようなハンドラがabort()で終了するようです。アボートのmanページでsegfaultを引き起こすことについて何も見つかりませんでした。

+6

でそれを確認することができます* *セグメンテーション違反ではないこと。それは中止です。あなたはそれがセグメンテーションだと思いますか? –

+0

@フレデリックハミディ:良いキャッチ!私は「コアダンプされた」メッセージによって誤解を受けました。 –

+0

これは 'SIGABRT'です –

答えて

6

例外をスローして処理しないでを呼び出すabort()を呼び出します。

#include <iostream> 
#include <stdexcept> 
#include <signal.h> 

extern "C" void handle_sigabrt(int) 
{ 
    std::cout << "Handling and then returning (exiting)" << std::endl; 
} 

int main() 
{ 
    signal(SIGABRT, &handle_sigabrt); 

    throw("pouet pouet"); 
} 

Demo

+0

良い例です。ライブデモでは、 '処理してから戻る(終了する)'の前に 'char const *'型のキャッチされていない例外で終了するのはなぜですか? – wally

+1

@Muscampester、最初のメッセージは、例外がキャッチされなかったことを検出すると実装から取得されます。それはメッセージを出力し、 'abort'を呼び出します。 – chris

+2

stdoutを 'std :: endl'で強制的に実行しても、そのメッセージは実装固有です。プログラムは、ハンドラが戻るとすぐに終了します。これを避けるための非常にハッキリな方法(したがって、非常に落胆)は返されません(http://melpon.org/wandbox/permlink/pzntUUEAEqHU1eGz)。もう一つの方法は、boost :: coroutine2(https://isocpp.org/blog/2016/11/coroutines-internals)で紹介されているスタックトランポリンを使用する方法です。これらのテクニックを使用するには、本番ソフトウェアに配備することを意図している場合、最小限の注意を払う必要があります。 –

関連する問題