web-dev-qa-db-ja.com

C ++コンソールプログラムを終了するにはどうすればよいですか?

プログラムを終了するコード行はありますか?

Pythonのsys.exit()のようなもの?

29
rectangletangle
#include <cstdlib>
...
exit( exit_code );
19

can呼び出しexit()(アプリケーションで致命的なエラーが発生した場合はそうする必要があります)が、プログラムを終了する最もクリーンな方法はmain()から戻ることです:

int main()
{
    // do whatever your program does

} // function returns and exits program

exit()を呼び出すと、自動ストレージ期間(ローカル変数)を持つオブジェクトは、プログラムが終了する前に破棄されないため、適切なクリーンアップを取得できません。これらのオブジェクトは、プログラムが正常に終了するために、所有するリソースのクリーンアップ、保留状態の変更の保持、実行中のスレッドの終了、またはその他のアクションの実行が必要になる場合があります。

26
James McNellis

プログラムを終了させる方法はいくつかあります。どちらが適切かは、プログラムを終了する理由によって異なります。ほとんどの場合、メイン関数でreturnステートメントを実行する必要があります。次のように。

int main()
{
     f();
     return 0;
}

他の人が特定したように、これにより、すべてのスタック変数を適切に破棄して、適切にクリーンアップすることができます。これはとても重要です。

コードのどこかでエラーを検出し、終了する必要がある場合は、メイン関数に戻るために例外をスローする必要があります。次のように。

struct stop_now_t { };
void f()
{
      // ...
      if (some_condition())
           throw stop_now_t();
      // ...
}

int main()
{
     try {
          f();
     } catch (stop_now_t& stop) {
          return 1;
     }
     return 0;
 }

これにより、スタックが巻き戻され、すべてのスタック変数が破棄されます。まだ非常に重要です。ゼロ以外の戻り値で障害を示すことが適切であることに注意してください。

万が一、プログラムがこれ以上ステートメントを実行しても安全ではないことを示す条件を検出した場合は、std :: abort()を使用する必要があります。これにより、プログラムはそれ以上処理されずに突然停止します。 std :: exit()も似ていますが、プログラムが十分に中断されている場合はatexitハンドラを呼び出す可能性があります。

7
Bowie Owens

はい! exit() 。入った <cstdlib>

4

値を返すか、実行が関数の最後に到達することを許可する によって実行フローがmainを離れることは、回復不可能な状況を除いてプログラムが終了する方法です。 C++では値を返すことはオプションですが、通常はcstdlibにあるEXIT_SUCCESS(プログラムが正常に実行されたことを示すプラットフォーム固有の値)を返します。

#include <cstdlib>

int main(int argc, char *argv[]) {
  ...
  return EXIT_SUCCESS;
}

ただし、プログラムが回復不能な状態に達した場合、例外をスローする必要があります。ただし、そうすることの意味を理解することが重要です。例外とすべきかどうかを決定するための広く受け入れられているベストプラクティスはありませんが、知っておく必要のある一般的な規則があります。

たとえば、デストラクタから例外をスローすることは、例外がすでにスローされているために、破壊されるオブジェクトが破壊された可能性があるため、ほぼ常にひどい考えです。 2番目の例外がスローされると、terminateが呼び出され、さらにクリーンアップが実行されることなくプログラムが停止します。あなたはcanを使用して uncaught_exception が安全かどうかを判断しますが、例外を許可しないことをお勧めします。デストラクタ。

通常、呼び出す関数は例外をスローするように書かれていませんが(たとえば、newは十分なメモリを割り当てることができない場合はstd::bad_allocをスローします)、初心者プログラマーにとっては難しい場合があります。 C++の例外を取り巻くすべての特別な規則を追跡するか、さらには知ることさえできます。このため、プログラムの実行を継続する賢明な方法がない状況でのみ使用することをお勧めします。

#include <stdexcept>
#include <cstdlib>
#include <iostream>

int foo(int i) {
  if (i != 5) {
    throw std::runtime_error("foo: i is not 5!");
  }
  return i * 2;
}

int main(int argc, char *argv[]) {
  try {
    foo(3);
  }
  catch (const std::exception &e) {
    std::cout << e.what() << std::endl;
    return EXIT_FAILURE;
  }
  return EXIT_SUCCESS;
}

exitはCからの持ち越しであり、自動ストレージを持つオブジェクトが適切にクリーンアップされない可能性があります。 abortおよびterminateを使用すると、プログラムが事実上自殺し、リソースがクリーンアップされません。

何をするにしても、適切に構造化されたプログラムを書くために松葉杖として例外、exit、またはabort/terminateを使用しないでください。例外的な状況のためにそれらを保存してください。

3
Sydius

メインにいる場合は、次のことができます:

return 0;  

または

exit(exit_code);

終了コードは、コードのセマンティクスに依存します。 1はエラー0 e、正常終了です。

プログラムの他の機能:

exit(exit_code)  

プログラムを終了します。

2
Corgan

この SO post は、exit()を使用しない理由と説明を提供します。読む価値があります。

つまり、main()で0を返す必要があります。これは、すべてのデストラクタを実行し、オブジェクトのクリーンアップを実行するためです。エラーを終了する場合もスローは機能します。

0
ConductedForce

Main()には、次のものもあります。

return 0;
0
Moberg
#include <cstdlib>
...
/*wherever you want it to end, e.g. in an if-statement:*/
if (T == 0)
{
exit(0);
}
0
Shadow