std::abort
ja.cppreference.net より
| ヘッダ <cstdlib>
|
||
void abort();
|
(C++11まで) | |
[[noreturn]] void abort() noexcept;
|
(C++11以降) | |
SIGABRT が std::signal に渡されたシグナルハンドラによって捕捉されており、そのハンドラが戻らない場合を除き、異常なプログラム終了を引き起こします。
自動、スレッドローカル(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ドキュメント
for
abort
|
|