std::atexit
Определён в заголовочном файле <cstdlib> | ||
|---|---|---|
int atexit( /*c-atexit-handler*/* func ); int atexit( /*atexit-handler*/* func ); | (1) | (до C++11) |
int atexit( /*c-atexit-handler*/* func ) noexcept; int atexit( /*atexit-handler*/* func ) noexcept; | (начиная с C++11) | |
extern "C" using /*c-atexit-handler*/ = void(); extern "C++" using /*atexit-handler*/ = void(); | (2) | (только для иллюстрации*) |
Регистрирует функцию, на которую указывает func, для вызова при нормальном завершении программы (через std::exit() или возврат из функции main)
| Функции вызываются при уничтожении статических объектов в обратном порядке: если A зарегистрирована раньше B, то вызов B выполняется раньше вызова A. То же правило действует для порядка между конструкторами статических объектов и вызовами | (до C++11) |
| Функции могут вызываться одновременно с уничтожением объектов со статической длительностью хранения и друг с другом; при этом гарантируется, что если регистрация A упорядочена перед регистрацией B, то вызов B упорядочен перед вызовом A. То же правило действует для порядка между конструкторами статических объектов и вызовами | (начиная с C++11) |
Одну и ту же функцию можно зарегистрировать несколько раз.
Если функция завершает работу посредством исключения, вызывается std::terminate.
atexit является потокобезопасной: вызов функции из нескольких потоков не приводит к гонке данных.
Реализация гарантированно поддерживает регистрацию как минимум 32 функций. Точный предел определяется реализацией.
Параметры
| func | - | указатель на функцию, вызываемую при нормальном завершении программы |
Возвращаемое значение
0, если регистрация прошла успешно, иное значение, отличное от нуля, в противном случае.
Примечания
Две перегрузки различаются, поскольку типы параметра func различны (связывание языка является частью его типа).
Пример
#include <cstdlib>
#include <iostream>
void atexit_handler_1()
{
std::cout << "At exit #1\n";
}
void atexit_handler_2()
{
std::cout << "At exit #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 || result_2)
{
std::cerr << "Registration failed!\n";
return EXIT_FAILURE;
}
std::cout << "Returning from main...\n";
return EXIT_SUCCESS;
}
Вывод:
Returning from main... At exit #2 At exit #1
См. также
| вызывает аварийное завершение программы (без очистки) (функция) |
|
| вызывает нормальное завершение программы с очисткой (функция) |
|
|
(C++11) | вызывает быстрое завершение программы без полной очистки (функция) |
|
(C++11) | регистрирует функцию для вызова при вызове std::quick_exit (функция) |
Документация по C для atexit |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/program/atexit