std::atexit
Материал из cppreference.com
| Defined in header <cstdlib>
|
||
| extern "C" int atexit( void (*func)() ); |
||
| extern "C++" int atexit( void (*func)() ); |
||
Регистрирует указатель функции 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 различны.
[править] Исключения
| (нет) | (до C++11) |
| спецификация noexcept: noexcept |
(начиная с C++11) |
[править] Пример
Запустить этот код
#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 != 0) or (result_2 != 0)) { std::cerr << "Регистрация не удачная\n"; return EXIT_FAILURE; } std::cout << "Возвращение из main\n"; return EXIT_SUCCESS; }
Вывод:
Возвращение из main Обработчик №2 Обработчик №1
[править] См. также
| (C++11) |
Регистрирует функцию, которая вызывается при вызове quick_exit (функция) |
| Справка по C — atexit
| |

