Namespaces
Variants

std:: abort

From cppreference.net
Utilities library
ヘッダーで定義 <cstdlib>
void abort ( ) ;
(C++11以前)
[ [ noreturn ] ] void abort ( ) noexcept ;
(C++11以降)

SIGABRT std::signal に渡されたシグナルハンドラによって捕捉され、かつハンドラが戻らない場合を除き、プログラムの異常終了を引き起こします。

自動 、スレッドローカル (C++11以降) および静的 ストレージ期間 を持つ変数のデストラクタは呼び出されません。 std::atexit() および std::at_quick_exit (C++11以降) で登録された関数も呼び出されません。ファイルなどのオープンされているリソースがクローズされるかどうかは実装定義です。実行が失敗したことを示す実装定義のステータスがホスト環境に返されます。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Parameters、Return value、Exceptions、Notes、Example、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、ID、リンク先は一切変更していません - 数値や書式設定は完全に保持されています

パラメータ

(なし)

戻り値

戻り値を返さないため、なし。

例外

例外を送出しません。

注記

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; // デストラクタは呼び出されない
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; // デストラクタは呼び出されない
    // ハンドラの設定
    auto previous_handler = std::signal(SIGABRT, signal_handler);
    if (previous_handler == SIG_ERR)
    {
        std::cerr << "Setup failed\n";
        return EXIT_FAILURE;
    }
    std::abort(); // SIGABRTを発生
    std::cout << "This code is unreachable\n";
}

出力:

Tester ctor
Tester ctor
SIGABRT received

関連項目

クリーンアップを行った通常のプログラム終了を引き起こす
(関数)
std::exit() 呼び出し時に実行される関数を登録する
(関数)
(C++11)
完全なクリーンアップを行わない高速なプログラム終了を引き起こす
(関数)
std::quick_exit 呼び出し時に実行される関数を登録する
(関数)
特定のシグナルに対するシグナルハンドラを設定する
(関数)
例外処理が失敗したときに呼び出される関数
(関数)