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 :

Plusieurs malloc : quid de free ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Plusieurs malloc : quid de free ?
    Bonjour à tous,
    Dans mon programme flex-bison, je fais un malloc sur une variable globale à chaque fois qu'une expression est reconnu, c'est à dire en quelques sortes j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    variable globale :
    char* s;
     
    fonction fct :
    if(Condition){
      s = malloc(20*sizeof(char));
      /* traitement */
    }
     
    main :
    fct();
    free(s);
    Evidement je ne peux passé s en paramètre a la fonction fct, car celle ci est fictive pour illustrer l'exemple, je rappelle que c'est un programme flex-bison.
    J'aurais voulu savoir si le seul free de s malgré plusieurs malloc sur s était suffisant ou bien s'il y avait des fuites de mémoire.

    Merci de votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Il y aura en effet une fuite de mémoire.
    Il faut faire un free par malloc.

  3. #3
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Le mieux serait d'initialiser le pointeur.
    Puis avant le malloc vérifier que le pointeur ne cible pas une zone mémoire.
    Si tel est le cas on utilise free avant de faire un nouveau malloc.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Tout d'abord merci de vos réponses.
    Le problème c'est que si je fais un free avant de refaire un autre malloc, mon programme ne marche plus.
    J'aimerais faire un free global en fin de programme mais ça ne marche pas.
    Par exemple la taille de s = sizeof(s) / sizeof(char);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i=0;i<sizeof(s) / sizeof(char);i++){
      free(s+i);
    }
    Là je désalloue de la mémoire déja désalloué.

    Le problème vient du fait que s n'est pas une matrice. Donc comment faire plusieurs free ?

  5. #5
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Malheureux on ne désaloue pas un char. Tu tentes de faire un truc du genre :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char s = 'a';
    free(s);
    Ce qui est différent de :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *s;
    s = (char*) malloc (2 * sizeof(char) );
    s[0] = 'a';
    s[1] = '\0';
    free(s);

    Le problème c'est que si je fais un free avant de refaire un autre malloc, mon programme ne marche plus.
    As-tu vérifié que tu ne tentais pas de désalouer du vide ?
    Ceci fonctionne à merveille :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *s;
    s = (char*) malloc (2 * sizeof(char) );
    free(s);
    s = (char*) malloc (5 * sizeof(char) );
    free(s);

  6. #6
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Citation Envoyé par Fer2Lance
    Le problème c'est que si je fais un free avant de refaire un autre malloc, mon programme ne marche plus.
    Là, ça cache un autre problème qu'on ne peut pas détecter avec le code succint fourni mais il y a, assurément, une grosse cagade quelque part ailleurs !

    Citation Envoyé par transgohan
    Le mieux serait d'initialiser le pointeur.
    Puis avant le malloc vérifier que le pointeur ne cible pas une zone mémoire.
    Si tel est le cas on utilise free avant de faire un nouveau malloc.
    Oui mais ... non. Si, techniquement, ça tient parfaitement la route et c'est tout à fait juste, en procédant de la sorte, le code n'a plus/pas beaucoup de sens (quoique ... ça n'arrête pas toujours tout le monde !) : les allocations sont toujours de la même taille, on manipule toujours la même variable pointeur (s) et donc ça reviendrait à :

    • initialiser s à NULL au tout début
    • désallouer s (s'il n'est pas NULL)
    • "perdre" son contenu
    • ré-allouer s, à la même taille
    • changer son contenu


    Pourquoi faire simple quand ...

    Je pense qu'il nous manque des éléments pour qu'on puisse t'aider efficacement.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par transgohan Voir le message
    Ceci fonctionne à merveille :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *s;
    s = (char*) malloc (2 * sizeof(char) );
    free(s);
    s = (char*) malloc (5 * sizeof(char) );
    free(s);
    Oui mais moi j'essais de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *s;
    s = (char*)malloc(20*sizeof(char));
    s = (char*)malloc(20*sizeof(char));
    free(s);
    Car si je fais free entre les deux mallocs, la valeur d'un attribut de ma structure change pour la valeur du deuxième s et etc... Bref je sais pas si je suis clair, mais en tout les cas c'est vrai que ça sens la grosse cagade !

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

Discussions similaires

  1. [AC-2007] Scinder une table liée à plusieurs tables: Quid des Données?
    Par Dr_No dans le forum Modélisation
    Réponses: 3
    Dernier message: 28/05/2009, 15h54
  2. gestion mémoire sur plusieurs malloc
    Par contremaitre dans le forum C
    Réponses: 39
    Dernier message: 27/03/2008, 13h51
  3. malloc calloc realloc free
    Par lia20 dans le forum C
    Réponses: 7
    Dernier message: 26/05/2007, 15h22
  4. free/malloc
    Par Duguesclin dans le forum C
    Réponses: 3
    Dernier message: 09/01/2005, 19h04
  5. malloc et free
    Par barthelv dans le forum C
    Réponses: 3
    Dernier message: 22/07/2003, 18h34

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