Help us understand the problem. What is going on with this article?

15秒で理解するmain関数からのreturnとexitとquick_exitとか

お詫びと訂正

初投稿時は15秒で目を通せそうな内容でしたが(当社比)、現状15秒では無理そうです。

はじめに

@celluloce に記事投稿の少し前にはなしたメモをせっかくだから上げておくだけです。

なお話がややこしくなるのでsignalとの絡みは割愛します。

main関数からのreturn文

  • main関数のスコープにある変数やstatic storageな記憶期間の変数のデストラクタが呼ばれる(C++)
  • というかautomatic storageな記憶期間の変数のデストラクタを呼んだあとexitを呼ぶ
  • なので、atexitで登録された関数が呼ばれる
atexitで登録した関数が呼ばれる
#include <iostream>
#include <cstdlib>
void on_exit()
{
    std::cout << "on_exit called" << std::endl;
}
int main(){
    std::atexit(on_exit);
    return 0;
}
実行結果
on_exit called

https://wandbox.org/permlink/QxiWKjAxiDbXHj9w

exit呼び出し

  • atexitで登録された関数を呼び出してから終了する
  • static storageな記憶期間の変数のデストラクタが呼ばれる(C++)
  • つまりC++では概ねquick_exitを使うべき(C++)

quick_exit呼び出し

  • at_quick_exitで登録された関数を呼び出してから終了する
  • C11/C++11から
  • 主にマルチスレッドプログラムの同期をキャンセルしてプログラムを終了させるときに。
  • Cストリームのバッファはフラッシュされない。
  • 一切のデストラクタを呼びたくないときもこっち(C++)

_Exit呼び出し

  • 基本quick_exitと同じ。というかquick_exitat_quick_exitで登録された関数を呼び出したあとにこれに処理を投げるので当たり前だけど

abort呼び出し

  • 基本_Exitと同じ。がしかし、これは異常終了を通知する。
  • at_quick_exitで登録された関数を呼び出さないと思うんだけど、C11規格書(N1570)やC++17規格書(N4659)を読んでも該当文章が見つからない・・・

まとめ

main関数からのreturn文 exit quick_exit _Exit abort
atexitで登録された関数の呼び出し
at_quick_exitで登録された関数の呼び出し ?
Cストリームバッファのフラッシュなど 処理系定義 処理系定義 処理系定義
static storageな期間をもつ変数の破棄
thread local storageな期間をもつ変数の破棄
automatic storageな期間をもつ変数の破棄

「Cストリームバッファのフラッシュなど 」というのは、

  • Cストリームバッファのフラッシュする
  • 開いているすべてのCストリームを閉じる
  • tmpfile関数で作られた一時ファイルの除去

の3点セットのこと。

ref

storageについては
C++のメモリーの話とストレージの有効期間の話をしようか

デストラクターとは?という人は
C++入門者に贈るclass入門とclass/structキーワードの使い分け

License

CC BY 4.0

CC-BY icon.svg

yumetodo
ありきたりなC++erです。最近C++書いていません(あれっ
http://yumetodo.hateblo.jp/
qiitadon
Qiitadon(β)から生まれた Qiita ユーザー・コミュニティです。
https://qiitadon.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした