Namespaces
Variants

std:: atexit

From cppreference.net
Utilities library
Défini dans l'en-tête <cstdlib>
(1)
int atexit ( /* c-atexit-handler */ * func ) ;
int atexit ( /* atexit-handler */ * func ) ;
(jusqu'à C++11)
int atexit ( /* c-atexit-handler */ * func ) noexcept ;
int atexit ( /* atexit-handler */ * func ) noexcept ;
(depuis C++11)
extern "C" using /* c-atexit-handler */ = void ( ) ;
extern "C++" using /* atexit-handler */ = void ( ) ;
(2) ( exposition uniquement* )

Enregistre la fonction pointée par func pour être appelée lors de la terminaison normale du programme (via std::exit() ou en retournant de la fonction main )

Les fonctions seront appelées lors de la destruction des objets statiques, dans l'ordre inverse : si A a été enregistré avant B, alors l'appel à B est effectué avant l'appel à A. La même règle s'applique à l'ordonnancement entre les constructeurs d'objets statiques et les appels à atexit : voir std::exit .

(until C++11)

Les fonctions peuvent être appelées concurremment avec la destruction des objets à durée de stockage statique et entre elles, tout en maintenant la garantie que si l'enregistrement de A était séquencé avant l'enregistrement de B, alors l'appel à B est séquencé avant l'appel à A, la même règle s'applique au séquencement entre les constructeurs d'objets statiques et les appels à atexit : voir std::exit .

(since C++11)

La même fonction peut être enregistrée plus d'une fois.

Si une fonction se termine par une exception, std::terminate est appelé.

atexit est thread-safe : l'appel de la fonction depuis plusieurs threads n'induit pas de course aux données.

L'implémentation garantit la prise en charge de l'enregistrement d'au moins 32 fonctions. La limite exacte est définie par l'implémentation.

Table des matières

Paramètres

func - pointeur vers une fonction à appeler lors de la fin normale du programme

Valeur de retour

0 si l'enregistrement réussit, valeur non nulle sinon.

Notes

Les deux surcharges sont distinctes car les types du paramètre func sont distincts (la liaison de langage fait partie de son type).

Exemple

#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;
}

Sortie :

Returning from main...
At exit #2
At exit #1

Voir aussi

provoque la fin anormale du programme (sans nettoyage)
(fonction)
provoque la fin normale du programme avec nettoyage
(fonction)
(C++11)
provoque la fin rapide du programme sans nettoyage complet
(fonction)
enregistre une fonction à appeler lors de l'invocation de std::quick_exit
(fonction)
Documentation C pour atexit