ATEXIT |
A la sortie |
---|---|
Langage C++ | cstdlib (stdlib.h) |
Syntaxe
int atexit(void (*ptrfonction)(void)) |
Paramètres
Nom | Description |
---|---|
ptrfonction | Ce paramètre permet d'indiquer une fonction à traiter avant de terminer le processus |
Description
Cette fonction doit être appelée à la fin d'un programme pour le terminer.
Remarques
- La fonction atexit() provoque l'appel de la fonction pointée par ptrfonction à la fin d'un programme normal. La fonction atexit() renvoie zéro si la fonction est correctement enregistrée en tant que fonction de terminaison, et elle est différente de zéro sinon.
- Au moins 32 fonctions de terminaison peuvent être établies et elles seront appelées dans l'ordre inverse de leur création.
- Définition et utilité : La fonction atexit permet d'enregistrer une fonction à appeler automatiquement à la fin de l'exécution du programme. Elle fait partie de la bibliothèque standard C++ et se trouve dans l'entête <cstdlib>. Cette fonction est souvent utilisée pour effectuer des opérations de nettoyage, telles que la libération de ressources ou la fermeture de fichiers, avant que le programme ne se termine.
- Syntaxe de atexit : La fonction atexit prend en paramètre un pointeur vers une fonction de type void (*func)(), c'est-à-dire une fonction sans argument et ne renvoyant rien. Cette fonction sera exécutée lorsqu'un programme se termine, soit normalement (par un retour de main), soit en cas d'appel à exit() ou une terminaison via des erreurs. Exemple d'enregistrement d'une fonction :
- Ordre d'exécution des fonctions enregistrées : Les fonctions enregistrées par atexit sont exécutées dans l'ordre inverse de leur enregistrement, c'est-à-dire que la dernière fonction enregistrée sera exécutée en premier lors de la terminaison du programme. Cette caractéristique est importante lorsqu'il s'agit de gérer des dépendances entre les ressources ou de s'assurer que certaines opérations de nettoyage soient effectuées en premier.
- Limitation sur le nombre de fonctions : Bien qu'il n'y ait pas de limite explicite définie par le standard C++ concernant le nombre de fonctions pouvant être enregistrées avec atexit, en pratique, cette limite est souvent imposée par le système ou l'implémentation spécifique de la bibliothèque standard. Sur certaines plateformes, cette limite peut être assez grande, mais il est bon de rester prudent si des appels multiples sont effectués.
- Non-garantie de support par certaines exceptions : Il est important de noter que si le programme se termine prématurément via une exception non capturée dans main() ou une autre partie du programme, les fonctions enregistrées avec atexit ne sont pas garanties d'être exécutées. Cela signifie qu'en cas d'exception non gérée, les nettoyages programmés par atexit pourraient être ignorés. Cela peut être un problème pour la gestion des ressources dans des programmes où les exceptions sont fréquentes.
- Gestion de ressources dans des environnements multi-processus léger : Lors de l'utilisation de atexit dans des programmes multi-processus léger, il est essentiel de se rappeler que ces fonctions sont appelées dans le processus léger principal lors de la terminaison du programme. Si des ressources sont partagées entre plusieurs processus léger, il est crucial de les gérer correctement pour éviter des conflits. En outre, l'usage de atexit dans des applications multi-processus léger nécessite parfois des mécanismes supplémentaires pour s'assurer qu'aucun processus léger ne tente d'utiliser des ressources après leur libération.
- Nettoyage de ressources systématiques : atexit est souvent utilisé dans des programmes nécessitant un nettoyage systématique des ressources, comme la libération de mémoire dynamique allouée, la fermeture de fichiers ouverts, ou la terminaison de connexions réseau. C'est une fonction simple à utiliser pour garantir que certaines tâches seront toujours effectuées lors de l'arrêt du programme, ce qui aide à éviter des fuites de mémoire ou des fuites de ressources.
- Interaction avec exit() et return de main() : Les fonctions enregistrées via atexit sont appelées lorsqu'un programme se termine soit via un appel à exit(), soit via la sortie normale de main() (en atteignant le return 0; ou la fin de la fonction). Cela inclut également les cas où le programme termine sans erreurs, par exemple lorsque l'exécution atteint la fin de main() ou que exit() est appelé explicitement dans le programme.
Exemple
Voici quelques exemples typiques de l'utilisation de cette fonction :

- #include <iostream>
- #include <cstdlib>
-
- void exitA(void) {
- std::cout << "Sortie A" << std::endl;
- }
-
- void exitB(void) {
- std::cout << "Sortie B" << std::endl;
- }
-
- void exitC(void) {
- std::cout << "Sortie C" << std::endl;
- }
-
- int main()
- {
- atexit(exitA);
- atexit(exitB);
- atexit(exitC);
- std::cout << "Début du programme" << std::endl;
- std::cout << "Corps du programme..." << std::endl;
- exit(0);
- std::cout << "Fin du programme jamais executé" << std::endl;
- return 0;
- }
on obtiendra le résultat suivant :
Début du programmeCorps du programme...
Sortie C
Sortie B
Sortie A
Voir également
Langage de programmation - C - Référence de procédures et fonctions - atexit
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 730.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 33.
Dernière mise à jour : Lundi, le 3 août 2015