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 :

Free() et Problème mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut Free() et Problème mémoire
    Bonjour bonjour,

    Voilà je suis sur un projet d'indexation de fichier dans un répertoire.
    j'utilise des pointeurs pour envoyer des données dans un tableau et récupérer les données d'un fichier.

    j'ai cette erreur :
    *** glibc detected *** free(): invalid pointer: 0xfef00d44 ***
    ou encore celle ci après modification de l'algo
    *** glibc detected *** double free or corruption: 0x080c75c7 ***
    Je vous montre l'algo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    void Lecture()
    {
        int test=0, test2=0, trouve=1;
        char *string1, *string2;
        temp=0;
        f1=fopen(nomfich,"r");
        while ((tableau=readdir(dossier))!=NULL)
        {
            test=strlen(tableau->d_name)+1;
            if (test>21)
            {
                rewind(f1);
                tabfich[temp]= malloc(strlen(tableau->d_name)+1);
                string1=tableau->d_name;
                trouve=1;
                while ((fgets(string2,test,f1)!=NULL)&&(trouve!=0))
                {
                    test2=strlen(string2);
                    if (test2>21)
                    {
                        test2=strncmp(string1, string2, test-1);
                        if (test2==0)
                        {
                            trouve=0;
                        }
                    }
                }
                if (trouve!=0)
                {
                    ouinon=1;
                    tabfich[temp]=string1;
                    temp++;
                }
            }
        }
        fclose(f1);
        free(string1);
        free(string2);
    }
    Vous avez une idée ?

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Tu déclares deux pointeurs de caractères string1 et string2. Et puis tu les utilises directement, sans même les avoir initialiser (regarde du coté des fonctions d'allocation mémoire comme malloc). Donc il est normal que lorsque tu essaies de libérer la mémoire allouée, il t'engueule, puisque tu n'as rien alloué.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Citation Envoyé par gangsoleil
    Bonjour,

    Tu déclares deux pointeurs de caractères string1 et string2. Et puis tu les utilises directement, sans même les avoir initialiser (regarde du coté des fonctions d'allocation mémoire comme malloc). Donc il est normal que lorsque tu essaies de libérer la mémoire allouée, il t'engueule, puisque tu n'as rien alloué.
    lol vi j'ai vu ça ... et pourtant en bidouillant un peu la solution est arrivée toute seule.

    En fait j'ai enlevé tous les malloc et les free et ça fonctionne dix fois mieux mdrrr

    comme quoi des fois ...

    Merci pour ton aide dans tous les cas

    Petit détail que je n'ai pas compris ... ma deuxième solution fonctionnelle marchait si simplement je faisais un free sur string1 ...

    Quelqu'un a une idée ?

  4. #4
    Expert confirmé

    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
    Par défaut
    Ton free marchait parce que tu as fait cette affectation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string1=tableau->d_name;
    Tu as surement fait un malloc pour la variable d_name...

    Jc

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,
    Citation Envoyé par Soum
    et pourtant en bidouillant
    Un conseil : change de langage !
    Le C n'est pas un langage pour bidouilleurs. Essai le KPL

    Maintenant si tu souhaite continue le C, il va falloir apprendre qu'à chaque malloc, doit correspondre un free; que certaines fonctions peuvent échouer (fopen, malloc par exemple), il faut vérifier ceci.

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

  6. #6
    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 Re: Free() et Problème mémoire
    Citation Envoyé par Soum
    Je vous montre l'algo :
    Ne compile pas. Merci de poster un code minimum mais compilable qui montre le problème.

  7. #7
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 17
    Par défaut
    Citation Envoyé par gege2061
    Un conseil : change de langage !
    Le C n'est pas un langage pour bidouilleurs. Essai le KPL
    Roh c'est méchant ça .

    Par contre, entièrement d'accord, les bidouilles rattrapent vite le programmeur (surtout quand on manipule la mémoire en C !).
    Tout début de corps de fonction doit comporter les déclarations PUIS les initialisations.
    Si tu oublies des initialisations, tu risques de libérer des zones de mémoire qu'il ne faut pas ! Ou d'écraser des zones de mémoire !

    /* Déclarations. */
    char * maChaine;

    long * monTableau;

    int i;
    int j;

    /* Initialisations. */
    maChaine = NULL;
    monTableau = NULL;

    i = 0;
    j = 0;

  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 AlBoLeToNo
    Si tu oublies des initialisations, tu risques de libérer des zones de mémoire qu'il ne faut pas ! Ou d'écraser des zones de mémoire !

    /* Déclarations. */
    char * maChaine;

    long * monTableau;

    int i;
    int j;

    /* Initialisations. */
    maChaine = NULL;
    monTableau = NULL;

    i = 0;
    j = 0;
    Hou que c'est laid !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char * maChaine   = NULL;
    long * monTableau = NULL;
    int    i = 0;
    int    j = 0;

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    lol j'explique l'affaire ...

    mon maitre de stage m'a demandé de réaliser un script dans un langage que je n'avais jamais approché lundi de la semaine dernière ... le c
    à partir de là ceci explique cela mais bon j'aurais pu faire pire car j'ai fini aujourd'hui ce projet là ... carpe diem ...

    et vive la bidouille quand meme quelque fois :p

  10. #10
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    Citation Envoyé par Soum
    lol j'explique l'affaire ...

    mon maitre de stage m'a demandé de réaliser un script dans un langage que je n'avais jamais approché lundi de la semaine dernière ... le c
    à partir de là ceci explique cela mais bon j'aurais pu faire pire car j'ai fini aujourd'hui ce projet là ... carpe diem ...

    et vive la bidouille quand meme quelque fois :p
    Tu devrais peut être poster ton code fini : Ce n'est pas parceque ton code fonctionne 99 fois que la 100ème fois il ne plantera pas.

    Bidouiller avec la mémoire en langage C, c'est pas exactement conseillé.

    Oh, et tu n'es pas obligé de ponctuer tes phrases pas kikoololmdr, y a rien de drôle (ou alors mon humour est aux antipodes du tien), et ça nuit à la lisibilité.

    Ce forum n'est pas un portable ou canal d'irc. Merci.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  11. #11
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Bidouiller avec la mémoire en langage C, c'est pas exactement conseillé.
    Source d'amusements chez certains, de calvitie chez d'autres.

  12. #12
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    mon maitre de stage m'a demandé de réaliser un script dans un langage que je n'avais jamais approché lundi de la semaine dernière ... le c
    J'ai jamais entendu dire que le langage C était un langage de script, on m'avait parlé de langage de programmation ...

    gege2061 a écrit:
    Un conseil : change de langage !
    Le C n'est pas un langage pour bidouilleurs. Essai le KPL

    Roh c'est méchant ça .
    Non pas méchant, réaliste ...

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Citation Envoyé par PRomu@ld
    J'ai jamais entendu dire que le langage C était un langage de script, on m'avait parlé de langage de programmation ...
    exact mais vu ce que je fais en ce moment ça ressemble plus à du scripting ... je me comprend ...

Discussions similaires

  1. Problème mémoire, c'est grave là :/
    Par gamerome dans le forum C++
    Réponses: 6
    Dernier message: 12/08/2005, 12h29
  2. [CR9] [VB.NET] problème mémoire
    Par prophetky dans le forum SDK
    Réponses: 1
    Dernier message: 26/05/2005, 08h36
  3. Problème mémoire
    Par charliejo dans le forum MFC
    Réponses: 8
    Dernier message: 13/04/2005, 13h45
  4. Problémes mémoire avec le bde sur des bases paradox
    Par Keke des Iles dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/05/2004, 16h55
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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