138

exit()C と C++ では、との違いは何abort()ですか? エラー (例外ではない) の後でプログラムを終了しようとしています。

4

5 に答える 5

124

abort()firstを使用して登録された関数を呼び出さatexit()ずに、またオブジェクトのデストラクタを最初に呼び出さずに、プログラムを終了します。exit()プログラムを終了する前に両方を行います。ただし、自動オブジェクトのデストラクタは呼び出しません。そう

A a;
void test() { 
    static A b;
    A c;
    exit(0);
}

適切に破棄abますが、 のデストラクタは呼び出しませんcabort()どちらのオブジェクトのデストラクタも呼び出しません。残念なことに、C++ 標準では、適切な終了を保証する別のメカニズムについて説明しています。

main()自動保存期間を持つオブジェクトは、関数が自動オブジェクトを含まず、 への呼び出しを実行するプログラムですべて破棄されexit()ます。main()で捕捉された例外をスローすることにより、制御をそのような に直接移すことができますmain()

struct exit_exception { 
   int c; 
   exit_exception(int c):c(c) { } 
};

int main() {
    try {
        // put all code in here
    } catch(exit_exception& e) {
        exit(e.c);
    }
}

を呼び出す代わりにexit()、そのコードを配置しますthrow exit_exception(exit_code);

于 2008-12-29T03:27:45.370 に答える
35

abortは SIGABRT シグナルを送信し、exitは通常のクリーンアップを実行しているアプリケーションを閉じるだけです。

アボート信号は好きなように処理できますが、デフォルトの動作では、アプリケーションもエラー コードで閉じられます。

abortは静的およびグローバル メンバーのオブジェクト破棄を実行しませんが、exitは実行します。

もちろん、アプリケーションが完全に閉じられると、オペレーティング システムは解放されていないメモリやその他のリソースを解放します。

アボート終了プログラムの終了の両方で (デフォルトの動作をオーバーライドしていないと仮定して)、アプリケーションを開始した親プロセスに戻りコードが返されます。

次の例を参照してください。

SomeClassType someobject;

void myProgramIsTerminating1(void)
{
  cout<<"exit function 1"<<endl;
}

void myProgramIsTerminating2(void)
{
  cout<<"exit function 2"<<endl;
}

int main(int argc, char**argv)
{
  atexit (myProgramIsTerminating1);
  atexit (myProgramIsTerminating2);
  //abort();
  return 0;
}

コメント:

  • abortのコメントが外されている場合: 何も出力されず、someobject のデストラクタは呼び出されません。

  • 上記のように中止がコメント化されている場合: someobject デストラクタが呼び出され、次の出力が得られます。

終了機能 2
終了機能 1

于 2008-12-29T03:25:24.830 に答える
12

exitプログラムが()を呼び出すと、次のことが起こります。

  • 関数によって登録されたatexit関数が実行されます
  • 開いているすべてのストリームがフラッシュされて閉じられ、によって作成されたファイルtmpfileが削除されます
  • プログラムは、ホストに指定された終了コードで終了します

( abort) 関数SIGABRTは現在のプロセスにシグナルを送信します。シグナルがキャッチされない場合、開いているストリームがフラッシュ/クローズされたり、作成された一時ファイルtmpfileが削除されたり、atexit登録された関数が呼び出されたり、非ゼロの終了ステータスがホストに返されます。

于 2008-12-29T03:32:22.773 に答える
6

abort信号を送りますSIGABRTabort呼び出し元には戻りません。シグナルのデフォルト ハンドラーはSIGABRT、アプリケーションを閉じます。 stdioファイル ストリームはフラッシュされてから閉じられます。ただし、C++ クラス インスタンスのデストラクタはそうではありません (これについてはわかりません -- おそらく結果は未定義ですか?)。

exitには独自のコールバックがあり、 で設定されatexitます。コールバックが指定されている (または 1 つだけ) 場合、それらは登録順序とは逆の順序で呼び出され (スタックのように)、プログラムは終了します。と同様にabortexit呼び出し元には戻りません。 stdioファイル ストリームはフラッシュされてから閉じられます。また、C++ クラス インスタンスのデストラクタが呼び出されます。

于 2008-12-29T03:29:00.813 に答える
6

exit() マニュアルページから:

exit() 関数はプロセスを正常に終了させ、status & 0377 の値を親に返します。

abort() マニュアルページから:

abort() は、最初に SIGABRT シグナルのブロックを解除し、次に呼び出しプロセスに対してそのシグナルを発生させます。これにより、SIGABRT シグナルが捕捉され、シグナル ハンドラが戻らない場合を除き、プロセスが異常終了します。

于 2008-12-29T03:29:10.657 に答える