Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C・C++におけるexit()関数と_Exit()関数の違いを徹底解説

本記事では、CおよびC++における exit() 関数と _Exit() 関数の違いについて詳しく解説します。

exit()関数と_Exit()関数の基本的な違い

C言語において、exit() 関数を呼び出すと、その関数以降に記述された残りのコードを実行することなく、呼び出し元のプロセスを直ちに終了させます。

C++11では、新たに _Exit() 関数が導入されました。では、この関数にはどのような特徴があるのでしょうか?

exit() 関数は、プログラムを終了する前にいくつかの後始末(クリーンアップ)処理を行います。具体的には、開いている接続の切断やバッファのフラッシュなどが該当します。一方、_Exit() 関数はこうしたクリーンアップ処理を一切行いません。そのため、atexit() 関数で登録したハンドラも実行されません。

それでは、まず exit() を使用した例、続いて _Exit() を使用した例を実際のコードで確認してみましょう。

例1:exit()関数を使用した場合

#include<bits/stdc++.h>
using namespace std;
void my_function(void) {
    cout << "Exiting from program";
}
int main() {
    atexit(my_function);
    exit(10);
}

実行結果

Exiting from program

exit() を使った場合は、atexit() で登録した関数が正常に呼び出され、「Exiting from program」というメッセージが出力されます。

例2:_Exit()関数を使用した場合

#include<bits/stdc++.h>
using namespace std;
void my_function(void) {
    cout << "Exiting from program";
}
int main() {
    atexit(my_function);
    _Exit(10);
}

実行結果

(何も出力されません)

_Exit() を使った場合、出力は一切ありません。atexit() で登録したハンドラが実行されず、プロセスが即座に終了するためです。

両者の違いまとめ

項目exit()_Exit()
標準規格C標準ライブラリC++11以降
atexit()登録関数の実行実行される実行されない
バッファのフラッシュ行われる行われない
ストリームのクローズ行われる行われない
終了の速さやや遅い(後始末あり)高速(即時終了)

このように、exit() は安全な終了処理を伴うのに対し、_Exit() は後始末を省略して即座にプロセスを終了させる関数です。用途に応じて適切に使い分けることが重要です。

  1. C++のdifftime()関数とは?構文・使い方・戻り値をわかりやすく解説

    本記事では、C++標準ライブラリに含まれるdifftime()関数について、その構文、動作の仕組み、そして戻り値について詳しく解説します。difftime()はC++に組み込まれている関数で、<ctime>ヘッダー(C言語では<time.h>)で定義されています。この関数は、time_t型の2つの引数を受け取り、2つの時刻の差を計算します。プログラムの実行時間の計測や、特定の時点からの経過時間を求める際などに活用される便利な関数です。構文double difftime(time_t end, time_t beginning);第1引数には終了時刻(end)、第2引数に

  2. C++のフレンド関数とフレンドクラスの基本を解説

    C++におけるフレンド関数(friend function)とは、クラスのスコープ外で定義される関数でありながら、そのクラスのすべてのprivateメンバーおよびprotectedメンバーにアクセスする権限を持つ特別な関数です。フレンド関数のプロトタイプ(宣言)はクラス定義の中に記述しますが、あくまで「友達」として扱われるだけであり、クラスのメンバー関数にはなりません。この点は重要なポイントです。フレンドとして指定できるものフレンドとして宣言できるのは、以下のようなものです。通常の関数関数テンプレート他のクラスのメンバー関数クラス全体(この場合、そのクラスのすべてのメンバーがフレンドになります