2013-11-26 27 views
7

私はCプログラム(main()はC言語)をC++とインターフェース接続しています。私のコードのいくつかの点で、私はプログラムの実行を停止したい。今私は知っている、私はこれをきれいにすることができますか?C/C++を混在させてプログラムを終了するには

私はstd::terminate()と呼んでいますが、より良いアイデアが不足しています。バグの主なものは私がメモリを解放していないということではない(プログラムの終了時に解放されるためだが)、MSVSジャストインタイムデバッガがポップアップして、私は醜いエラーメッセージを表示するランタイムを異常な方法で終了します。

編集:これは混乱の原因となりました。この場合は、main()からreturn 0に戻すことはできません。

+6

exit(0)の何が問題なのですか? –

+2

AFAIK std :: terminateは、異常終了を示すために使用されます(たとえば、キャッチされていない例外がトップレベルに達した場合など)。これによりデバッガがトリガされる可能性があります。 – wintermute

+1

きれいなやり方は、コントロールフローを正しく処理し、標準的な方法(ハンドル、オブジェクト、スレッドの結合など)で終了することです。 'exit(0)'は醜い選択肢です – Bruce

答えて

7

もしあなたが懸念

exit(EXIT_SUCCESS); // or EXIT_FAILURE 

exitterminateabortの間で最良の選択です。 descructorsを呼び出し、自動ストレージ・オブジェクト(グローバルスコープで宣言されたオブジェクト)をクリーンアップexit

  • 機能。また、atexitに渡された関数を呼び出します。

  • 機能abortは、異常終了時に役立ち、何もクリーンアップしません。渡された関数はatexitにはコールされません。

  • 機能terminateは、Cには存在しません。例外があり、それを処理することはできませんが、プログラムを終了すると便利です。

+1

exitはすべてのデストラクタを呼び出さない – user1233963

+2

@ user1233963:[_ "スタティックストレージ期間を持つオブジェクトのデストラクタは、コンストラクタの完了の逆順または動的初期化の完了の順番で呼び出されます。](http://en.cppreference.com/w/cpp/utility/program/exit) – deepmax

+1

@M M. http://ideone.com/UHg9dk – user1233963

3

main機能はどこから始まるのですか?main機能は通常終了すべき場所です。 return 0;を使用すると、正常終了を示します。

int main(void) { 
    //init 
    //do stuff 
    //deinit 
    return 0; // bye bye 
} 

またexit(0);を使用することができますが、あなたの出口点は、あらゆる場所に散在している場合には、デバッグに難しいものになります。その後、destuctorsをクリーンアップし、呼び出しについて

+0

残念ながら、私は 'main()'に0を返すことはできません。しかし、exit(0)を使っていました。いつもそれはプログラムを終了させるC-ishのようなものだと思っていました。 – fewu

+0

@fewu 'main'の戻り値の型が' int'であることを確認してください。 – user694733

関連する問題