IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Fonction exit et liberation de la mémoire


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pérou

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Fonction exit et liberation de la mémoire
    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+

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    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.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 897
    Points : 219 643
    Points
    219 643
    Billets dans le blog
    125
    Par défaut
    Bonjour,

    Citation Envoyé par b.pierre Voir le message
    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 ?
    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.

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pérou

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    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+

  5. #5
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 855
    Points : 2 176
    Points
    2 176
    Par défaut
    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".

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    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.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 35
    Points : 47
    Points
    47
    Par défaut
    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.

  8. #8
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    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).

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 897
    Points : 219 643
    Points
    219 643
    Billets dans le blog
    125
    Par défaut
    @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.

  10. #10
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pérou

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ok, j'ai bien compris.
    Merci pour votre temps et vos réponses, ce forum a l'air vraiment bien.
    A bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction exit
    Par maniweb dans le forum ASP
    Réponses: 2
    Dernier message: 25/01/2006, 02h23
  2. fonction exit
    Par nadia lydia dans le forum Oracle
    Réponses: 1
    Dernier message: 22/11/2005, 11h40
  3. Que se passe t-il sans fonction exit?
    Par Poseidon13 dans le forum C
    Réponses: 7
    Dernier message: 21/10/2005, 18h47
  4. parametre de la fonction exit
    Par mehdi.creator dans le forum C
    Réponses: 15
    Dernier message: 28/07/2005, 17h17
  5. Détourner une fonction pour copier un fichier en mémoire
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/11/2003, 08h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo