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

POSIX C Discussion :

Mémoire alloué avec malloc, libéré quand fermeture du processus ?


Sujet :

POSIX C

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

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Par défaut Mémoire alloué avec malloc, libéré quand fermeture du processus ?
    Bonsoir tout le monde,

    Quand une variable est alloué avec malloc et que l'on n'a pas utilisé free(variable);, quand le programme est fermé, la mémoire est-elle bien rendu libre ?

    Je pose cette question, car, dans un programme, quand une variable alloué avec malloc doit durée pendant toute l'exécution du programme, peut-on se passer de free même si c'est un peu crados ?

    Merci.
    A+, Pierre.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Pierre.g
    Quand une variable est alloué avec malloc et que l'on n'a pas utilisé free(variable);, quand le programme est fermé, la mémoire est-elle bien rendu libre ?
    Oui. Mais ça ne signifie pas que c'est une Bonne Pratique.
    Je pose cette question, car, dans un programme, quand une variable alloué avec malloc doit durée pendant toute l'exécution du programme, peut-on se passer de free même si c'est un peu crados ?
    Après les globales, les malloc() sans free(). C'est pour un concours de goretisation ?

    http://emmanuel-delahaye.developpez.com/goret.htm

    Techniquement, oui, on peut se passer de la libération, mais
    • Si on utilise un traqueur de mémoire (valgrind, Purify etc. ), on le pollue avec des libérations manquantes non significatives qui peuvent masquer un réel problème de libération de mémoire.
    • Si le code devient réutilisable, il ne gère pas bien la mémoire. Les conséquences peuvent être graves et la correction à postériori plus difficile et plus couteuse.
    • Ca m'empêche de dormir se savoir qu'il existe du code bancal comme ça dans la nature...

    Bref, le bon sens, c'est de retirer le gros poil que tu as dans la main, et d'écrire du code correct dès le premier jour :
    • pas de globales mais des contextes
    • un malloc(), un free().

    On compte sur toi pour allonger la liste... Ma boule de cristal vient de me dire 'FILE*'...

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Normalement, toute la mémoire utilisée par un processus quelconque (ton application qui tourne étant à considérer comme un processus) est libérée lorsque le processus est proprement tué...

    Donc, oui, de fait, on pourrait très bien se passer de libérer explicitement la mémoire si cela ne faisait pas crado...

    Par contre, c'est loin d'être tres bon...

    D'abord, il est intéressant de prendre l'habitude de libérer correctement la mémoire allouée dynamiquement à quelque chose dés que tu n'en a plus besoin...

    Le cas d'une variable devant "durer aussi longtemps que l'application" n'étant qu'un cas particulier qui mérite d'être traité comme tous les autres...

    Il faut bien te dire que, si tu prend la mauvaise habitude de ne pas libérer les variables qui durent aussi longtemps que l'application, tu risques fort de te retrouver à mettre cette habitude en pratique pour celles qui ont une durée de vie clairement limitée... et que c'est à ce moment là que tu finiras par tomber sur un os à un moment ou un autre... (ben oui, meme si le Mb de RAM ne coute plus rien de nos jour, et qu'on en a de plus en plus, ce n'est quand meme pas infini )

    De plus, il faut bien savoir que ton application risque très fort d'être, pour une raison ou une autre, interfacée avec d'autres... qui risquent de ne pas tuer le processus de la tienne en temps et en heure... ce qui reportera le problème sur l'application "interfacante"...

    Bien que l'exemple que je m'apprete à citer soit plus le fait de VB que du C++, penses à tous les problèmes rencontrés lorsque l'on interface une application de MS (word, excell, outlook) et qu'on ne prend pas la précaution de passer avec le "garbage collector" une fois que l'on n'a plus besoin des applications lancées...

    Au fil du temps, tu te trouves avec 5,6...10 processus de l'application... Si pas plus (et qui survient parfois à l'arret de l'application qui les a lancés, d'ailleurs)...le tout, menant à un joli écran bleu si connu sous les versions précédentes...

    Le fait de libérer correctement autant de ressources que possible lorsque ton application arrive à son terme, meme si le processus n'est pas correctement tué par l'application qui l'a lancé, permettra d'avoir une meilleur résistance à ce genre de phénomène...

    D'ailleurs, quand on y pense bien...

    Il y a des chances que ton application soit articulée autour d'une structure de programme du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main()
    {
        tontype *tavariable_immortelle;
        tavariable_immortelle=init();
        /*utilisation au gre de l'application */
     
        return 0;
    }
    Pourquoi travailler comme un cochon, alors qu'il suffirait de rajouter, juste avant le return 0, un appel sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Libere(tavariable_immortelle);
    tavariable_immortelle=NULL;
    avec la fonction Libere qui libérerait proprement la mémoire allouée dynamiquement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 256
    Par défaut
    Merci à vous deux,

    "Après les globales, les malloc() sans free(). C'est pour un concours de goretisation ?"
    => j'y ais pensé en faisant ce post

    Sinon, je posais ces question principalement pour savoir si ça vidais la mémoire quand le processus se fermais, j'imaginais bien que oui, mais ce n'étais qu'une suposition.

    Pour l'absence de free();, je suis d'accord avec vos arguments, faut donc que je ne prenne pas de mauvaise habitudes ...

    Merci.
    A+, Pierre.

  5. #5
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/04/2009, 17h42
  2. Réponses: 3
    Dernier message: 05/04/2007, 14h56
  3. Mémoire graphique avec StringGrid
    Par Jeanzeze dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/10/2005, 11h28
  4. [JVM & tomcat] Modifier la mémoire allouée
    Par sylvain_neus dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 22/06/2004, 09h13
  5. Erreur de sgmentation avec malloc
    Par simonm dans le forum C
    Réponses: 5
    Dernier message: 27/02/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