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 :

malloc, free et les fuites


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 44
    Par défaut malloc, free et les fuites
    ça fait maintenant un moment que je programme en C et j'ai toujours cru que tout appel à malloc sans free correspondant génère une fuite de mémoire, ce que je crois être un zone de mémoire non libérée à la fin de l'execution du programme.

    Mais voilà qu'en cours d'info on nous dit que lorsque l'on appelle pas free, la mémoire sera libérée automatiquement.
    Est-ce vrai ?

    Si oui, pourquoi attache-t-on autant d'importance à la traque des moindres fuites de mémoire ?

    Syrmonsieur

  2. #2
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    En fait ce qu'on appelle "fuite memoire" n'est pas exactement le fait d'avoir de la memoire allouee presente a la fin du programme.

    Une fuite memoire correspond au fait d'allouer de la memoire, et d'egarer ensuite le pointeur sur la zone allouee.

    Sur un programme qui s'execute en une seconde (typiquement commande shell), ce n'est pas vraiment genant (bien que sale).

    En revanche, sur un programme de type serveur, ou demon quelconque, ca devient vite catastrophique.

    Imagine par exemple un serveur ou on voit quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char   *command;
     
    while (1)
    {
       if (receive_command())
       {
          command = malloc(getcommandsize());
          getcommand(command);
          process_command(command);
       }
    }
    La memoire n'est jamais liberee, et on n'a aucun moyen de la retrouver...

    Si ce serveur tourne en permanence, et bien il faudra rebooter la machine tous les trois jours, voire toutes les trois heures suivant l'afflux de commandes.

  3. #3
    Membre éclairé Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Par défaut
    Au bout d'un certain temps il ne te sera plus possible d'allouer de la mémoire, tes
    malloc calloc realloc finiront par planter.

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Il m'a une fois été dit (mais ca reste à vérifier) que certains systèmes très prévenant et robuste dans la gestion de mémoire comme Linux par exemple, s'occupe parfois de la libération de zones mémoire mallencontreusement (désolé je connais po l'orthographe de ce mot ) oublié à la fin d'un processus.

    Est-ce vrai ou est-il au moins possible de le vérifier ?

    Ma foi, je n'y est jamais vraiment cru
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tous les systèmes récents (unixoïdes, WinNT, et peut-être bien Win32-nonNT) désallouent automatiquement toute la mémoire d'un processus quand celui-ci se termine.

    C'est pourquoi, comme précisé plus haut, c'est principalement pour les processus longs que cela pose problème.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Médinoc
    Tous les systèmes récents (unixoïdes, WinNT, et peut-être bien Win32-nonNT) désallouent automatiquement toute la mémoire d'un processus quand celui-ci se termine.

    C'est pourquoi, comme précisé plus haut, c'est principalement pour les processus longs que cela pose problème.
    Ok merci de l'info ... en tous cas n'empêche pas qu'il est préférable de le faire soi même
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre chevronné Avatar de Rei Angelus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2006
    Messages
    292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 292
    Par défaut
    Citation Envoyé par Médinoc
    C'est pourquoi, comme précisé plus haut, c'est principalement pour les processus longs que cela pose problème.
    J'ajouterai quand même que cela dépend aussi de la capacité de mémoire dont tu disposes.

    Si tu travailles sur un "gros" système avec des centaines de Mo voire quelques Go ce n'est pas la même chose que si tu bosses par exemple sur un système embarqué où la capacité mémoire est généralement beaucoup plus petite. Et là ça risque de ne pas être très long avant de planter.

  8. #8
    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 Rei Angelus
    J'ajouterai quand même que cela dépend aussi de la capacité de mémoire dont tu disposes.

    Si tu travailles sur un "gros" système avec des centaines de Mo voire quelques Go ce n'est pas la même chose que si tu bosses par exemple sur un système embarqué où la capacité mémoire est généralement beaucoup plus petite. Et là ça risque de ne pas être très long avant de planter.
    Ce qui est une Bonne Chose. Parce que si il faut attendre 2 mois ou 2 ans avant que ça plante, ça le fera probablement (conformément aux lois de Murphy) le jour de la présentation devant le client, ce qui est une Mauvaise Chose...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 44
    Par défaut
    OK merci pour vos réponses.
    Je vais donc continuer à respecter le principe "à tout malloc son free".

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Naturellement.

    Sache qu'il existe également des outils pour détecter les fuites de mémoire... (purify, valgrind (je crois), ou encore des outils fournis par l'environnement de développement, ou encore une bibliothèque personnelle...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Médinoc
    valgrind (je crois)
    Oui tu peut même être sûr de toi: memcheck mais je crois que Valgrind ne tourne que sur des Unixoïdes !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. [Malloc - Free] Comment bien les utiliser dans ce cas ?
    Par DOC doc doc dans le forum Débuter
    Réponses: 6
    Dernier message: 06/08/2007, 14h39
  2. Traquer les fuites mémoires (memoryLeak) ?
    Par MonsieurAk dans le forum Windows
    Réponses: 2
    Dernier message: 08/09/2005, 09h07
  3. Les fuites de la mémoire!!!!!!!!
    Par pointer dans le forum Langage
    Réponses: 5
    Dernier message: 07/09/2005, 14h30
  4. Réponses: 10
    Dernier message: 22/02/2005, 16h11
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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