std::exit
Материал из cppreference.com
Определено в заголовочном файле <cstdlib>
|
||
void exit( int exit_code ); |
(до C++11) | |
[[noreturn]] void exit( int exit_code ); |
(начиная с C++11) | |
Нормально завершает программу.
Несколько действий по очистке происходят:
1) деструкторы для объектов со статическим временем хранения вызываются в обратном порядке выполнения их конструкторов или их динамических инициализаций, а также функции, отправленные в std::atexit, вызываются в обратном порядке их регистрации (последняя зарегистрированная вызывается первой).
а) любые статические объекты, чья инициализация завершилась до вызова std::atexit для некоторой функции F, будут уничтожены после вызова F во время завершения программы.
б) любые статические объекты, чьё построение началось после вызова std::atexit для некоторой функции F, будут уничтожены до вызова функции F во время завершения программы (этот пункт включает случай, когда std::atexit была вызвана в конструкторе статического объекта).
|
(до C++11) |
1) деструкторы объектов с потоковым и статическим временем хранения и функции зарегистрированные в std::atexit выполняются одновременно, при этом гарантируется то, что:
а) последний деструктор для потоковых (thread-local) объектов выполнится до первого деструктора для статических объектов.
б) если завершение конструктора или динамической инициализации для потокового или статического объекта A было выполнено до потокового или статического объекта B, завершение деструктора для B произойдёт до начала выполнения деструктора для A.
в) если завершение инициализации статического объекта A было до вызова std::atexit для некоторой функции F, то вызов F во время завершения программы произойдёт до начала вызова деструктора для A.
г) если вызов std::atexit для некоторой функции F был до завершения инициализации статического объекта A, то начало вызова деструктора для A произойдёт до вызова F во время завершения программы.
д) если вызов std::atexit для некоторой функции F1 был до вызова std::atexit для некоторой функции F2, то вызов F2 будет до F1 во время завершения программы.
|
(начиная с C++11) |
1) Выполняется следующее:
- Если функция зарегистрирована в
atexit
или любой деструктор статического или потокового объекта вызовет исключение, std::terminate будет вызван. - Если компилятор решил поднять динамическую инициализацию объекта до фазы статической инициализации non-local initialization, последовательность вызовов деструкции будет как и у динамической инициализации.
- Если локальный (в блоке) статический объект был уничтожен, а затем эта функция была вызвана из деструктора другого статического объекта и выполнение дошло до определения этого объекта (или он был использован неявно, через указатель или ссылку), поведение не определено.
- Если локальный (в блоке) статический объект был инициализирован во время построения подобъекта класса или массива, он будет уничтожен только после уничтожения всех подобъектов этого класса или всех элементов этого массива.
- Если функция зарегистрирована в
2) все буферы Си потоков будут сброшены и закрыты.
3) файлы созданные с помощью std::tmpfile будут удалены.
4) управление будет возвращено в среду выполнения. Если
exit_code
будет равен EXIT_FAILURE, зависимый от реализации код статуса, обозначающий неудачное завершение, будет возвращён. Иначе будет передан определённый реализацией код статуса.Стек не разматывается: деструкторы объектов с автоматической временем хранения не вызываются.
Содержание |
[править] Отношение к функции main
Возвращение от функции main, как по оператору return
, так и по достижению конца функции, вызывает обычное завершение функции (вызываются деструкторы для переменных с автоматическим временем хранения) и затем вызывается std::exit с аргументом из оператора return (или 0, если неявный return используется) в качестве exit_code
[править] Аргументы
exit_code | - | Код завершения программы |
[править] Возвращаемое значение
(Нет)
[править] Пример
Запустить этот код
#include <iostream> #include <cstdlib> class Static { public: ~Static() { std::cout << "деструктор статического объекта\n"; } }; class Local { public: ~Local() { std::cout << "деструктор локальной переменной\n"; } }; Static static_variable; // деструктор статического объекта БУДЕТ вызван void atexit_handler() { std::cout << "обработчик atexit\n"; } int main() { Local local_variable; // Деструктор НЕ будет вызван const int result = std::atexit(atexit_handler); // обработчик будет вызван if (result != 0) { std::cerr << "регистрация atexit не удачна\n"; return EXIT_FAILURE; } std::cout << "проверка\n"; std::exit(EXIT_FAILURE); }
Вывод:
проверка обработчик atexit деструктор статического объекта
[править] See also
Вызывает аварийное завершение программы (без очистки) (функция) | |
Регистрирует функцию, которая вызывается при вызове exit() (функция) | |
(C++11) |
Вызывает нормальное завершение программы без полной очистки (функция) |
C documentation for exit
|