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

std::atexit

Материал из cppreference.com
< cpp‎ | utility‎ | program
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, 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)
Недостижимый поток управления
Взаимодействие с окружением
Сигналы
Типы сигналов
Нелокальные переходы
Типы
 
Определено в заголовочном файле <cstdlib>
(1)
int atexit( /*c-atexit-обработчик*/* func );
int atexit( /*atexit-обработчик*/* func );
(до C++11)
int atexit( /*c-atexit-обработчик*/* func ) noexcept;
int atexit( /*atexit-обработчик*/* func ) noexcept;
(начиная с C++11)
extern "C" using /*c-atexit-обработчик*/ = void();
extern "C++" using /*atexit-обработчик*/ = void();
(2) (только для пояснения*)

Регистрирует функцию, на которую указывает func, для вызова при обычном завершении программы (через std::exit()) или при возврате из функции main)

Функции будут вызываться при уничтожении статических объектов в обратном порядке: если A была зарегистрирована до B, то вызов B выполняется до вызова A. То же самое относится к порядку между конструкторами статических объектов и вызовами atexit (смотрите std::exit)

(до C++11)

Функции могут быть вызваны конкурентно с деструкторами объектов со статической длительностью хранения и друг с другом, сохраняя гарантию того, что если регистрация A была произведена до регистрации B, то вызов B будет до вызова A, то же самое применимо для последовательности между конструкторами статических объектов и вызовами atexit (смотрите std::exit )

(начиная с C++11)

Одна и та же функция может быть зарегистрирована более одного раза.

Если функция завершается через исключение, вызывается std::terminate.

atexit является потокобезопасной: вызов функции из нескольких потоков не вызывает гонки данных.

Реализация гарантированно поддерживает регистрацию как минимум 32 функций. Точный предел определяется реализацией.

Содержание

[править] Параметры

func указатель на функцию, которая будет вызываться при обычном завершении программы

[править] Возвращаемое значение

0, если регистрация прошла успешно, иначе ненулевое значение.

[править] Примечание

Две перегрузки различны, так как типы параметров func различны. (языковое связывание является частью этих типов).

[править] Пример

#include <iostream>
#include <cstdlib>
 
void atexit_handler_1() 
{
    std::cout << "На выходе #1\n";
}
 
void atexit_handler_2() 
{
    std::cout << "На выходе #2\n";
}
 
int main() 
{
    const int result_1 = std::atexit(atexit_handler_1);
    const int result_2 = std::atexit(atexit_handler_2);
 
    if (result_1 or result_2)
    {
        std::cerr << "Регистрация не удалась!\n";
        return EXIT_FAILURE;
    }
 
    std::cout << "Возврат из main\n";
    return EXIT_SUCCESS;
}

Вывод:

Возврат из main
На выходе #2
На выходе #1

[править] Смотрите также

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