abortはプログラムの「異常な」終了を示し、POSIXシグナルSIGABRTを発生させます。つまり、そのシグナルに登録したハンドラーが呼び出されますが、プログラムはどちらの場合もアフターワードを終了します。通常abortは、Cプログラムで使用して、エラーがプログラムのバグである可能性が高い、予期しないエラーのケースを終了します。誤った入力やネットワーク障害などではありません。たとえば、abort論理的に決して発生してはならないときに、データ構造にNULLポインタが含まれていることが判明した場合などです。
exitはプログラムの「正常な」終了を示しますが、これはまだ障害を示している可能性があります(ただし、バグではありません)。つまり、exitユーザーが解析できない入力をしたり、ファイルを読み取れなかったりすると、エラーコードが表示される可能性があります。終了コード0は成功を示します。exitまた、オプションで、プログラムを終了する前にハンドラーを呼び出します。これらはatexitおよびon_exit関数に登録されています。
std :: terminateは、未処理の例外があるときにC ++プログラムで自動的に呼び出されるものです。これはabort、例外をスローすることによってすべての例外エラーを報告していると仮定すると、基本的にと同等のC ++ です。これは、std::set_terminate関数によって設定されたハンドラーを呼び出します。このハンドラーは、デフォルトでは単にを呼び出しますabort。
C ++では、通常、呼び出しabortやexitエラーの発生を回避する必要があります。例外をスローし、コードを呼び出しスタックのさらに上の方に置いて、プログラムの終了が適切かどうかを判断する方がよいからです。exit成功のために使用するかどうかは状況の問題です-のreturnステートメント以外の場所でプログラムを終了することが理にかなっているかどうかmain。
std::terminateC ++であっても、最後の溝のエラー報告ツールと見なす必要があります。の問題std::terminateは、終了ハンドラーが処理されなかった例外にアクセスできないため、それが何であったかを知る方法がないことです。通常は、main全体を1つのtry { } catch (std::exception& ex) { }ブロックでラップする方がはるかに優れています。少なくとも、そこから派生した例外に関する詳細情報を報告できますstd::exception(もちろん、派生しない例外はstd::exception処理されないままになります)。
mainin の本体をラップするtry { } catch(...) { }ことは、問題の例外にアクセスできないため、終了ハンドラーを設定するよりもはるかに優れています。編集:ニール・バターワースの回答によると、この場合スタックが巻き戻されるという利点があります。これは(多少意外にも)未処理の例外には当てはまりません。