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 :

Perte de mémoire - je ne comprend pas.


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Points : 17
    Points
    17
    Par défaut Perte de mémoire - je ne comprend pas.
    Bonjour,

    Je vous explique mon problème, j'ai un gros programme qui est plusieurs fois amené à comparer des chaines de caractères. Actuellement , il fonctionne parfaitement et valgrind ne detecte aucune perte de mémoire ...

    Le problème est que je viens de me rendre compte que le programme doit aussi pouvoir comparer des chaines de caractères sans tenir compte des majuscules. donc ma solution est de passer mes chaines de caractères en minuscule.

    Pour cela , je me suis fait une petite fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void MajToMin(char *mot,char *mot2)
    {
    int i;
    for (i=0;i<strlen(mot);i++)
       {
         *(mot2+i)=tolower(*(mot+i));
       }
     
     (*(mot2+strlen(mot)))='\0';
    }
    ensuite , si mon but est de convertir une chaine de caractères balise_temporaire en miniscule,
    je l'appelle de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    balise_temporaire2=(char*)malloc(sizeof(char)*strlen(balise_temporaire)+1);
    MajToMin(balise_temporaire,balise_temporaire2);
    free(balise_temporaire);
    balise_temporaire=balise_temporaire2;
    Le programme fonctionne très bien mais maintenant, valgrind me dit que 2 block mémoire n'ont pas été libérés et ce quelque soit le nombre de fois où j'utilise ma fonction MajToMin ...

    Merci d'avance de votre aide

  2. #2
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Tu as oublié de mettre le code de l'allocation de balise_temporaire.
    Il n'y a pas de free() de balise_temporaire2.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    merci de ta réponse mais
    l'allocation de balise_temporaire est faite bien plus haut ds le code , je n'ai pas jugé utile de la mettre .

    je fais aussi un free de balise_temporaire2, mais bien plus bas ds le code.


    J'ai voulu chercher un peu plus loin et j'ai tout modifié par quelque chose d'encore plus simple:

    j'ai maintenant une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void MajToMin2(char *mot)
    {
    int i;
    int n=strlen(mot);
    for (i=0;i<n;i++)
       {
         *(mot+i)=tolower(*(mot+i));
       }
     
     (*(mot+n))='\0';
     
     
    }
    que j'appelle juste en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MajToMin2(balise_temporaire);
    et bien sur je libère balise_temporaire quand j'en ai plus besoin... et bha je perds la meme mémoire.
    Je me dis maintenant que le problème vient surement dailleurs mais pourquoi est ce que sans ce bout de code , je ne perd aucune mémoire, ça m'échappe ..
    a l'aide

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pilouface
    Je vous explique mon problème, j'ai un gros programme qui est plusieurs fois amené à comparer des chaines de caractères. Actuellement , il fonctionne parfaitement et valgrind ne detecte aucune perte de mémoire ...

    Le problème est que je viens de me rendre compte que le programme doit aussi pouvoir comparer des chaines de caractères sans tenir compte des majuscules. donc ma solution est de passer mes chaines de caractères en minuscule.

    Pour cela , je me suis fait une petite fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void MajToMin(char *mot,char *mot2)
    {
    int i;
    for (i=0;i<strlen(mot);i++)
       {
         *(mot2+i)=tolower(*(mot+i));
       }
     
     (*(mot2+strlen(mot)))='\0';
    }
    Cette fonction est une catastrophe écologique. Elle consomme des MWh pour rien.

    Essaye l'informatique verte :
    /!\ les paramètres sont dans le sens habituel (des, src) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void str_cpy_tolower(char *des, char const *src) /* edited */
    {
       while (*src != 0)
       {
          *des = tolower(*src);
          src++;
          des++;
       }
       *des = 0;
    }
    ensuite , si mon but est de convertir une chaine de caractères balise_temporaire en miniscule,
    je l'appelle de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    balise_temporaire2=(char*)malloc(sizeof(char)*strlen(balise_temporaire)+1);
    MajToMin(balise_temporaire,balise_temporaire2);
    free(balise_temporaire);
    balise_temporaire=balise_temporaire2;
    Le programme fonctionne très bien mais maintenant, valgrind me dit que 2 block mémoire n'ont pas été libérés et ce quelque soit le nombre de fois où j'utilise ma fonction MajToMin ...
    C'est super tordu comme codage... Mais j'ai eu un avant gout de ton esprit tortueux avec la première fonction...

    En fait tu as simplement besoin d'une fonction qui met une chaine en minuscule, sous réserve que celle-ci soit modifiable. Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void str_tolower(char *s)
    {
       while (*s)
       {
          *s = tolower (*s); /* edited */
          s++;
       }
    }
    ensuite, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       str_tolower (balise_temporaire);
    et voilà. Affaire réglée.

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void str_cpy_tolower(char const *des, char *src)
    Juste une petite correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void str_cpy_tolower(char *des, const char *src)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par crocodilex
    Juste une petite correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void str_cpy_tolower(char *des, const char *src)
    Exact. D'où l'utilité d'une désignation cohérente. Merci.

    Je corrige.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    merci bcp a vous deux :

    le compilateur me renvoit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liste1.c: In function ‘str_tolower’:
    liste1.c:344: warning: statement with no effect
    c'est la ligne :
    tolower (*s);

    J'ai quand meme essayé et ca ne fonctionne pas. ca s'execute mais ca ne transforme pas la chaine en minuscule ...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    valgrind me renvoit ça :


    j'ai modifié ta fonction en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void str_tolower(char *s)
    {
       while (*s)
       {
        *s = tolower (*s);
          s++;
       }
    }
    la ca fonctionne mais j'ai toujours l'erreur de mémoire de valgrind:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ==3717== malloc/free: in use at exit: 704 bytes in 2 blocks.
    ==3717== malloc/free: 26,218 allocs, 26,216 frees, 135,400 bytes allocated.
    ==3717== For counts of detected errors, rerun with: -v
    ==3717== searching for pointers to 2 not-freed blocks.
    ==3717== checked 47,616 bytes.
    ==3717==
    ==3717== LEAK SUMMARY:
    ==3717==    definitely lost: 0 bytes in 0 blocks.
    ==3717==      possibly lost: 0 bytes in 0 blocks.
    ==3717==    still reachable: 704 bytes in 2 blocks.
    ==3717==         suppressed: 0 bytes in 0 blocks.
    ==3717== Reachable blocks (those to which a pointer was found) are not shown.
    ce qui est bizarre , c'est qu'il ne trouve aucune mémoire perdue quand j'utilise pas de fonction pour convertir en minuscule

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pilouface
    le compilateur me renvoit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liste1.c: In function ‘str_tolower’:
    liste1.c:344: warning: statement with no effect
    c'est la ligne :
    tolower (*s);
    Oui, désolé, j'en ai oublié un bout. Tu as bien fait de corriger. J'ai modifié mon post.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pilouface
    valgrind me renvoit ça :
    <...>
    ce qui est bizarre , c'est qu'il ne trouve aucune mémoire perdue quand j'utilise pas de fonction pour convertir en minuscule
    Est-tu absolument certain que l'adresse passée à la fonction soit valide, c'est à dire
    • correspond à un bloc existant
    • ce bloc est modifiable
    • le bloc est initialisé avec une chaine valide (donc terminée par un 0)

    par ce que ça ressemble à un débordement de bloc alloué dynamiquement. Quelques printf() bien placés devraient lever le doute...

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Un programme minimal, compilable et qui présente ce problème permettra aussi de lever le doute,
    Jc

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Génial !!!

    J'ai isolé mon code dans des programmes isolé et j'ai fini grace au debugger "ddd" par trouver que j'avais pas initialisé un pointeur dans une liste chainée, et ca faisait tout foiré.

    Merci beaucoup à vous tous

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pilouface
    Génial !!!

    J'ai isolé mon code dans des programmes isolé
    Oui, méthode de mise au point connue et éprouvée...

Discussions similaires

  1. Perte de mémoire, pas de données perdues ?
    Par BartRoX dans le forum Sécurité
    Réponses: 8
    Dernier message: 31/08/2015, 09h35
  2. Allocation mémoire, je ne comprends pas !
    Par bouba dans le forum C
    Réponses: 5
    Dernier message: 13/12/2005, 13h11
  3. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  4. sql ne comprend pas mon where!et me demande des parametres
    Par marie10 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 20/04/2004, 11h08
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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