名前空間
変種
操作

std::abort

From cppreference.com
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
 
ヘッダ <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() の呼び出し時に呼ばれる関数を登録する
(関数) [編集]
完全なクリーンアップを行わずに、高速なプログラム終了を引き起こす
(関数) [編集]
std::quick_exit の呼び出し時に呼ばれる関数を登録する
(関数) [編集]
特定のシグナルに対するシグナルハンドラを設定する
(関数) [編集]
例外処理が失敗した際に呼び出される関数
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)