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

std::atexit

Материал из 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 t-dcl-rev-num "> </tbody><tbody> </tbody>
Определено в заголовочном файле <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
(функция) [править]