見出し画像

【C++】プログラムの「正しい終わり方」とは?4つの終了方法を比較

C++のプログラムは、通常、main関数のreturn 0;で、きれいに終了します。でも、時には、プログラムの深い階層で、回復不能なエラーが発生した際に、その場で即座に、プログラムを停止させたい場合もありますよね。

この、プログラムを終了させるための、**①正常終了(return)、②即時終了(exit)、③高速終了(quick_exit)、④異常終了(terminate)**という、4つの方法の、デストラクタの呼び出しに関する、決定的な違いを理解したい。

  • 4つの終了方法とその違い: C++には、プログラムを終了させるための、いくつかの方法があり、それぞれ「後片付け」の丁寧さが異なります。

    1. return from main(正常終了 - 最推奨):

      • 最も標準的で、安全な終了方法です。

      • ローカルオブジェクトとグローバルオブジェクトの両方のデストラクタが、正しく呼び出されます

    2. std::exit()(即時終了):

      • プログラムを即座に終了させます。

      • ローカルオブジェクトのデストラクタは呼び出されませんが、グローバルオブジェクトのデストラクタは呼び出されます。

    3. std::quick_exit()(高速終了):

      • exitよりも、さらに簡素な後片付けで、プログラムを終了させます。

      • ローカルもグローバルも、いかなるオブジェクトのデストラクタも呼び出されません

    4. std::terminate()(異常終了):

      • 回復不能なエラーが発生したことを示し、プログラムを異常終了させます。

      • いかなるデストラクタも呼び出されません。通常の終了処理には使いません。

私の運営サイトでは、これら4つの異なる方法でプログラムを終了させた場合に、ローカルオブジェクトとグローバルオブジェクトのデストラクタが、それぞれ、いつ呼ばれて、いつ呼ばれないのかを、具体的なC++コードで、その実行結果と共に、分かりやすく比較・解説しています。

▼詳しい解説とサンプルコードはこちら 【C++】プログラムを終了させる4つの方法 (exit, quick_exit, terminate)

プログラムの安全な後片付けを保証するために、可能な限りmain関数からのreturnでプログラムを終了させるべきです。exit系の関数は、RAIIの原則を破壊するため、その挙動を完全に理解した上で、限定的に使用する必要があります。


いいなと思ったら応援しよう!