Question

Est-il utile de libérer de la mémoire dans une fonction atexit ()?

J'ai une variable globale qui obtient un malloc après le démarrage. Je pourrais écrire une fonction atexit () pour la libérer, mais le système ne va-t-il pas récupérer toute cette mémoire lorsque le programme se terminera?

Y a-t-il un avantage à ranger et à nettoyer moi-même?

Était-ce utile?

La solution

Pas en C, c’est comme si on réarrangeait les chaises longues pendant que le navire s’enfonce autour de vous.

En C ++, la réponse est différente, car les objets peuvent supprimer des fichiers temporaires et ainsi de suite dans leurs destructeurs. Vous devez donc vous assurer qu'ils sont appelés.

Autres conseils

L'un des avantages de cette libération est que, si vous effectuez un test de fuite de mémoire qui tente de faire correspondre les allocations avec des désallocations pendant toute la durée du processus, vous ne ferez pas de faux positifs de ce type de fuite délibérée.

Voir malloc () / free () implique normalement de nombreuses structures de données existant dans l'espace utilisateur, free () en mémoire lorsque votre les fins de programme peuvent en réalité être une perte de performances. Si des parties de la structure de données sont paginées sur le disque, elles ne doivent être chargées à partir du disque que pour être ignorées!

Alors que si vous terminez sans free () , les données renvoyées sur le disque peuvent disparaître en paix.

Bien sûr, free () à d'autres moments est généralement bénéfique, car d'autres malloc () peuvent réutiliser l'espace que vous avez libéré et free () pourrait même annuler la mise en correspondance de la mémoire, qui pourra ensuite être utilisée par d'autres processus.

Dans tous les systèmes d'exploitation modernes, vous pouvez supposer en toute sécurité que toute la mémoire sera libérée à la fermeture du programme.

En réalité, le nettoyage peut être intéressant lorsque votre programme évolue. Il vous oblige à écrire la fonction de nettoyage lorsque vous créez "initialisation". les fonctions. L'avantage survient lorsque votre programme devient plus complexe et que vous souhaitez redémarrer une partie du programme. Si vous avez déjà écrit des fonctions de nettoyage fonctionnelles, il est moins probable que vous ayez soudainement oublié certains travaux de nettoyage lors de la procédure de "redémarrage". une partie de votre programme.

Écriture des fonctions de nettoyage "paresseusement" c'est-à-dire que lorsque vous en avez besoin, les erreurs sont plus nombreuses. L’écriture des fonctions de nettoyage vous oblige à penser au nettoyage et à sa dépendance éventuelle. Cela permet de réutiliser plus facilement une partie de votre code dans un autre projet.

Donc oui, libérer dans un atexit est inutile, de même que fermer le descripteur de fichier. Cependant, écrire et maintenir la fonction de nettoyage à mesure que votre code grandit peut être une contrainte qui vous obligera à réfléchir à ce que vous faites

Vous devriez libérer () si votre code appelant atexit () fait partie d'une bibliothèque partagée chargée dynamiquement (avec dlopen (), par exemple). Dans ce cas, le gestionnaire atexit sera appelé au moment de dlclose (), de sorte que le tas continuera d'exister pour le reste du processus.

Sous Windows, certains appels renvoient de la mémoire appartenant au système d'exploitation ou à COM et vous devez libérer cette mémoire de manière explicite, sinon elle ne sera pas libérée même après la fin du processus. Mais ce scénario est rare.

ne pas libérer de mémoire avant la fin du processus n'est pas une fuite de mémoire. c'est une fuite de mémoire lorsque vous perdez une poignée. mais la mémoire n'est pas le seul type de ressource, et d'autres ressources persistent d'un processus à l'autre (comme les descripteurs de fenêtre et de fichier), vous devez donc les "libérer".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top