0
void myterminate () 
{
   cout << "terminate handler called";
}

int main (void) 
{
   set_terminate (myterminate);
   
   throw;  // throwing an exception. So, terminate handler should be invoked 
           // as no one is handling this exception.    
   getch();
   return 0;
}

しかし、このコードを実行した後の出力は次のとおりです。

+ "Debug Error!" と呼ばれるハンドラを終了します。ダイアログボックスが表示されます。

なんでこうなるのかわからない!!!!助けてください。

4

3 に答える 3

4

set_terminateの MSDN ドキュメントに基づいて、新しいハンドラー関数を呼び出す必要があるexit()か、またはabort()呼び出されます。

set_terminate 関数は、terminate によって呼び出される関数として term_func をインストールします。set_terminate は C++ 例外処理で使用され、例外がスローされる前にプログラム内の任意の時点で呼び出すことができます。通話を終了すると、デフォルトで中止されます。このデフォルトを変更するには、独自の終了関数を作成し、その関数の名前を引数として set_terminate を呼び出します。terminate は、set_terminate の引数として指定された最後の関数を呼び出します。必要なクリーンアップ タスクを実行した後、term_func はプログラムを終了する必要があります。終了しない場合 (呼び出し元に戻った場合)、abort が呼び出されます。

例えば:

void myterminate () 
{
   cout << "terminate handler called";
   exit(1);
}
于 2012-04-07T14:43:41.520 に答える
2

規格の要件によると、として使用される機能はterminate_handler、次の要件を満たす必要があります (ISO/IEC 14882:2011 18.8.3.1)。

必要な動作: Aterminate_handlerは、呼び出し元に戻らずにプログラムの実行を終了する必要があります。

関数がこの要件を満たしていないため、プログラムには未定義の動作があります。std::coutカスタム診断を表示するには、 (多くのプラットフォームで必要になる可能性があるため) に改行を出力してから、 を呼び出すなど、何らかの方法でプログラムを終了する必要がありますstd::abort

std::abortプログラムの異常終了を通知するために使用されるため、表示されているダイアログ ボックスなどを介して、追加の診断がユーザーに報告されることを期待できます。

終了ハンドラからの使用は、またはに登録された関数で発生した例外条件に応答して呼び出される可能性があるため、std::exit潜在的に危険であることに注意してください。これにより、2 回目の呼び出しが試行されます。std::terminatestd::atexitstd:: at_quick_exitstd::exit

要約すると、「異常な」終了を望まない場合は、ほとんどの場合、スローした例外をキャッチする必要があります。

于 2012-04-07T14:52:58.253 に答える
1

終了ハンドラでプログラムを終了する必要があります。次の行をハンドラーに追加すると、機能します。

exit(-1);
于 2012-04-07T14:43:56.810 に答える