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

std::exit

Материал из cppreference.com
< cpp‎ | utility‎ | program
 
 
 
Коммунальные услуги Программа поддержки
Программа прекращения
Оригинал:
Program termination
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
abort
exit
quick_exit(C++11)
_Exit(C++11)
Взаимодействие с окружающей средой
Оригинал:
Communicating with the environment
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Сигналы
Оригинал:
Signals
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Сигнал типа
Оригинал:
Signal types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
SIGABRT
SIGFPE
SIGILL
SIGINT
SIGSEGV
SIGTERM
Нелокальные переходы
Оригинал:
Non-local jumps
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
setjmp
longjmp
Типы
Оригинал:
Types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
jmp_buf
 

Определено в заголовочном файле <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()
(функция) [править]
Вызывает нормальное завершение программы без полной очистки
(функция) [править]