close
Пространства имён
Варианты
Действия

std::abort

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Утилиты поддержки программ
Прерывание программы
(C++11)
(C++11)
Недостижимый поток управления
Взаимодействие с окружением
Сигналы
Типы сигналов
Нелокальные переходы
Типы
 
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>
Определено в заголовочном файле <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) или __debugbreak (msvc) можно использовать для максимально быстрого завершения программы.

Пример

#include <csignal>
#include <iostream>
#include <cstdlib>

class Tester {
public:
    Tester()  { std::cout << "Tester конструктор\n"; }
    ~Tester() { std::cout << "Tester деструктор\n"; }
};

Tester static_tester; // Деструктор не вызывается

void signal_handler(int signal) 
{
    if (signal == SIGABRT) {
        std::cerr << "Получен SIGABRT\n";
    } else {
        std::cerr << "Получен неожидаемый сигнал: " << signal << "\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 << "Ошибка установки\n";
        return EXIT_FAILURE;
    }

    std::abort();  // Вызов SIGABRT
    std::cout << "Этот код недоступен\n";
}

Вывод:

Tester конструктор
Tester конструктор
Получен SIGABRT

Смотрите также

вызывает нормальное завершение программы с очисткой
(функция) [править]
регистрирует функцию, которая будет вызываться при вызове std::exit()
(функция) [править]
вызывает быстрое завершение программы без полной очистки
(функция) [править]
регистрирует функцию, которая будет вызываться при вызове std::quick_exit
(функция) [править]
устанавливает обработчик для конкретного сигнала
(функция) [править]
функция, вызываемая при сбое обработки исключения
(функция) [править]