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

std::atexit

Материал из 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>
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

[править] См. также

Регистрирует функцию, которая вызывается при вызове quick_exit
(функция) [править]
C documentation for atexit