Bonjour,
Avant d’exécuter la fonction exit dois-je libérer toute la mémoire allouée dynamiquement (par le biais par exemple de la fonction atexit) ou cela est fait automatiquement ?
Merci. A+
Bonjour,
Avant d’exécuter la fonction exit dois-je libérer toute la mémoire allouée dynamiquement (par le biais par exemple de la fonction atexit) ou cela est fait automatiquement ?
Merci. A+
Le mieux, c'est d'adopter les bonnes habitudes de programmation. C'est au programmeur de libérer la mémoire qu'il a allouée, lorsqu'il n'en a plus besoin. Même si les OS courants savent nettoyer la mémoire lorsqu'un processus se termine, ce n'est pas propre de leur demander de le faire.
Bonjour,
Oui vous le devez !
La fonction exit() ne fait rien d'autre que de quitter le programme (elle ne s'occupe absolument pas de la mémoire, et de toute façon, elle ne saurai pas retrouver tout vos pointeurs).
La fonction atexit() permet de définir une fonction qui sera appelé lors de la fermeture du programme. Dans la fonction que vous allez spécifier à atexit, vous pouvez tenter de faire un peu de nettoyage, mais cela vous forcera certainement à mettre vos pointeurs dans des variables globales, ce qui n'est pas une bonne solution non plus.
Donc si j'ai bien compris :
Si dans mon programme une fonction remonte une erreur critique, je dois libérer toute la mémoire allouée à droite à gauche avant de quitter le programme en évitant de passer par atexit() qui m'obligerait à mettre mes pointeurs dans une structure globale.
C'est pas vraiment pratique je trouve. Comment, lorsqu'une erreur survient, avoir accès à tous les pointeurs des objets alloués dynamiquement ?
Quelle serait la meilleure démarche pour traiter ce problème de gestion d'erreurs ?
Si par mégarde j'oublie de libérer une zone mémoire allouée dynamiquement avant de quitter le programme, quand cette zone mémoire sera t-elle libérée ?
Merci. A+
Tu te débrouilles pour que ton programme récupères l'erreur (sans crasher) et tu le quittes normalement.
Si tu oublies de libérer de la mémoire que tu as allouée, si tu n'es pas sous windows 95 tu n'as pas trop de soucis à te faire, la mémoire sera libérée dès que tu processus aura quitter, mais il est bien mieux de ne pas laisser l'os le faire (comme l'a dit jeroman) car cette solution n'est pas "propre".
A ceux qui pensent que qu'il est sale de terminer sans libérer la totalité de ce qu'on a alloué, et que l'OS vous fait une immense faveur en libérant cette mémoire pour vous, une pensée à méditer : quand vous faites une allocation, c'est l'OS qui vous alloue la mémoire.
Humm le mieux si tu veux coder proprement.
Vérifie tes valeurs de retour d'une fonction, elle te renvoie une erreur, retourne jusqu'à ton main() en libérant toute ta mémoire.
matafan ce n'est pas salle mais une mauvaise habitude qu'il ne faut pas prendre, mieux vaut avoir ce réflexe de libérer la mémoire.
Je suis d'accord pour le cas nominal, mais à mon avis il est illusoire de penser qu'on peut systématiquement libérer tout ce qu'on a alloué en cas de sortie anormale. Et je pense aussi que c'est une perte de temps et d'énergie d'essayer de le faire (je parle de programmation système ; si on fait de l'embarqué par exemple, ça peut être différent).
@matafan: Je suis entièrement d'accord qu'il est pénible de devoir gérer sa mémoire à la main et de faire attention à toute allocation / désallocation.
D'autant plus que nos systèmes moderne, ainsi que nos machines surpuissantes le gèrent plutôt assez bien.
Mais, lorsque vous codez sur des machines / systèmes limités (microprocesseur, µITRON, GBA, GP2X, ...) il est absolument nécessaire de le faire, sous peine de devoir redémarrer la machine juste à cause d'un bug, qui bloc la mémoire après 1h d'utilisation.
Donc, si cela vous dérange de trop, de gérer la mémoire, je vous conseille de vous orienté vers des langages / technologies telles que Java ou C# / .NET
Sinon, il reste nécessaire de faire attention à ces allocations, désallocations.
Ok, j'ai bien compris.
Merci pour votre temps et vos réponses, ce forum a l'air vraiment bien.
A bientôt.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager