std:: atexit
|
Определено в заголовке
<cstdlib>
|
||
| (1) | ||
|
int
atexit
(
/* c-atexit-handler */
*
func
)
;
int atexit ( /* atexit-handler */ * func ) ; |
(до 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 function )
|
Функции будут вызываться во время разрушения статических объектов в обратном порядке: если A был зарегистрирован до B, то вызов B производится до вызова A. То же самое относится к порядку между конструкторами статических объектов и вызовами
|
(until C++11) |
|
Функции могут вызываться параллельно с разрушением объектов со статической продолжительностью хранения и друг с другом, сохраняя гарантию, что если регистрация A была упорядочена до регистрации B, то вызов B упорядочен до вызова A, то же самое относится к упорядочиванию между конструкторами статических объектов и вызовами
|
(since C++11) |
Одна и та же функция может быть зарегистрирована более одного раза.
Если функция завершается через исключение, std::terminate вызывается.
atexit
является потокобезопасной: вызов функции из нескольких потоков не вызывает состояние гонки данных.
Реализация гарантированно поддерживает регистрацию как минимум 32 функций. Точный предел определяется реализацией.
Содержание |
Параметры
| func | - | указатель на функцию, которая будет вызвана при нормальном завершении программы |
Возвращаемое значение
0 если регистрация прошла успешно, в противном случае - ненулевое значение.
Примечания
Две перегрузки различаются, потому что типы параметра func различны ( language linkage является частью его типа).
Пример
#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 documentation
для
atexit
|
|