std::abort
From cppreference.com
| ヘッダ <cstdlib> で定義 |
||
void abort(); |
(C++11まで) | |
| [[noreturn]] void abort() noexcept; |
(C++11以降) | |
std::signal に渡されたシグナルハンドラが SIGABRT を捕捉しており、そのハンドラが戻らない限り、異常なプログラム終了を引き起こします。
自動、スレッドローカル(C++11以降)および静的記憶域期間を持つ変数のデストラクタは呼び出されません。std::atexit() と std::at_quick_exit(C++11以降) で登録された関数も呼び出されません。ファイルなどの開かれたリソースが閉じられるかどうかは実装定義です。失敗した実行を示す実装定義のステータスがホスト環境に返されます。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
戻らないため、なし。
[編集] 例外
何もスローしません。
[編集] 備考
POSIXでは、`abort()`関数は`SIGABRT`シグナルのブロックまたは無視を上書きすることを規定しています。
一部のコンパイラ組み込み関数、例えば`__builtin_trap` (gcc、clang、icc) や`__fastfail` / `__debugbreak` (msvc) は、可能な限り高速にプログラムを終了させるために使用できます。
[編集] 例
このコードを実行
#include <csignal> #include <cstdlib> #include <iostream> class Tester { public: Tester() { std::cout << "Tester ctor\n"; } ~Tester() { std::cout << "Tester dtor\n"; } }; Tester static_tester; // Destructor not called void signal_handler(int signal) { if (signal == SIGABRT) std::cerr << "SIGABRT received\n"; else std::cerr << "Unexpected signal " << signal << " received\n"; std::_Exit(EXIT_FAILURE); } int main() { Tester automatic_tester; // Destructor not called // Setup handler auto previous_handler = std::signal(SIGABRT, signal_handler); if (previous_handler == SIG_ERR) { std::cerr << "Setup failed\n"; return EXIT_FAILURE; } std::abort(); // Raise SIGABRT std::cout << "This code is unreachable\n"; }
出力
Tester ctor Tester ctor SIGABRT received
[編集] 関連項目
| クリーンアップを伴う通常のプログラム終了を引き起こす (関数) | |
| std::exit() の呼び出し時に呼ばれる関数を登録する (関数) | |
| (C++11) |
完全なクリーンアップを行わずに、高速なプログラム終了を引き起こす (関数) |
| (C++11) |
std::quick_exit の呼び出し時に呼ばれる関数を登録する (関数) |
| 特定のシグナルに対するシグナルハンドラを設定する (関数) | |
| 例外処理が失敗した際に呼び出される関数 (関数) | |
| C言語ドキュメント (abort)
| |