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 :

problème Libération de mémoire sur tableau de point


Sujet :

C

  1. #21
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Il faut mettre desc_ref.chrChampsCle a NULL avant d'appeler F_descriptif (ou le faire au debut (pas dans la boucle) de celle-ci).
    Ou alors faire le test (entre calloc/realloc avec intNbChamp (qui lui doit bien etre initialise)).

  2. #22
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par D[r
    eadLock]Il faut mettre desc_ref.chrChampsCle a NULL avant d'appeler F_descriptif (ou le faire au debut (pas dans la boucle) de celle-ci).
    Ou alors faire le test (entre calloc/realloc avec intNbChamp (qui lui doit bien etre initialise)).
    j'ai mis desc_ref.chrChampsCle a NULL, cela ne change rien.


    Ce que j'aimerais comprendre, c'est comment sont libérés les allocations faites par ma fonction ExtractChaine ?
    Est-ce qu'en libérant les allocations faites pour les dimensions de mon tableau cela libère les pointeurs que portent chaque indice du tableau ?

  3. #23
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par danel
    Ce que j'aimerais comprendre, c'est comment sont libérés les allocations faites par ma fonction ExtractChaine ?
    Est-ce qu'en libérant les allocations faites pour les dimensions de mon tableau cela libère les pointeurs que portent chaque indice du tableau ?
    Normallement oui.
    Si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    desc->chrChampsCle[intNbChamp]=ExtractChaine(ptrChrBufferLect,ptrTemp);
    avec Extract qui alloue le pointeur renvoye,
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    free(desc->chrChampsCle[intIndice]);
    La chaine allouee par Extract est bien liberee.

    Par contre, est-ce que ton compteur est bien initialise a 0 (desc->intNbChampsCle) ?

    Sinon, tu peux tracer toutes les allocations (chrChampsCle[%d]=%p) apres l'appel a Extract..., puis lors des free. Et voir si y'a un truc qui cloche.

    Autre chose, il vaut mieux avoir des operations atomiques:
    par exemple faire desc->chrChampsCle[desc->intNbChampsCle]=Extr..

    De meme pour les allocations des tableaux
    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
     
    main(){
        /* init */
        desc_ref.chrChampsCle=NULL;
        desc_ref.intNbChampsCle=0;
        desc_data.chrChampsCle=NULL;
        desc_data.intNbChampsCle=0;
     
        /* appels des fonctions F_descriptif */
     
     
        /* desallocations */
        for(i=0;i<desc_ref.intNbChampsCle;i++){
            free(desc_ref.chrChampsCle[i]);
        }
        for(i=0;i<desc_data.intNbChampsCle;i++){
            free(desc_data.chrChampsCle[i]);
        }
    }
     
     
    F_descriptif()
     
        /* nouveau champs */
        desc->intNbChampsCle++;
        desc->chrChampsCle=(char **)realloc(desc->chrChampsCle,sizeof(char *)*desc->intNbChampsCle);
        if (desc->chrChampsCle==NULL) 
            // erreur
        desc->chrChampsCle[desc->intNbChampsCle-1]=Extract...
    questions subsidiaires :
    - pourquoi tu ne mets pas sizeof(char) plutot que T_CHAR ?
    - pourquoi testes-tu si chrChampsCle[intIndice]==NULL pour le free ? tu le libere ailleurs ? Sinon, tu es sur que ce pointeur ne vaut pas NULL (car renvoye par Extract... qui l'as teste).

  4. #24
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par D[r
    eadLock]
    Autre chose, il vaut mieux avoir des operations atomiques:
    par exemple faire desc->chrChampsCle[desc->intNbChampsCle]=Extr..
    OKAY je prends note

    Citation Envoyé par D[r
    eadLock]
    questions subsidiaires :
    - pourquoi tu ne mets pas sizeof(char) plutot que T_CHAR ?
    #define T_CHAR sizeof(char)

    Citation Envoyé par D[r
    eadLock]
    - pourquoi testes-tu si chrChampsCle[intIndice]==NULL pour le free ? tu le libere ailleurs ? Sinon, tu es sur que ce pointeur ne vaut pas NULL (car renvoye par Extract... qui l'as teste).
    Oui je me le demande...
    je plaisante, c'est de l'extreme prudence qui normalement si tout est bien codé
    est de l'extreme inutilité

    Je corrige...

    Bon je pense que j'ai trouvé le problème mais je ne m'explique pas l'effet de bord.

    Dans la fonction F_descriptif(...) j'utilise un pointeur temporaire à qui j'affecte une adresse via la fonction ExtractChaine mais tu t'endoutes je ne le
    libérais pas exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    				ptrTemp=ExtractChaine(ptrChrBufferLect,ptrEgalite); 
    				Trim(ptrTemp);
    				if(memcmp(LONGUEUR,ptrTemp,strlen(LONGUEUR)) == 0) {
     
    					if(boolDEBUG) fprintf(stdout,"\n LONGUEUR\n");
     
    					//on fixe le pointeur temporaire à l'adresse du buffer
    					ptrTemp=ptrChrBufferLect;
    Et voilà le travail....

    j'ai donc rajouté :
    En plus pour la petite histoire j'avais mal utilisé memwtach j'avais oublié l'include
    dans le .h où est définit ExtractChaine.
    Il me trouvait donc des "WILD free" pratout.

    Bref, je ne comprends pas bien l'effet de bord qui m'arrivait car il me semble que si je ne libère pas un espace mémoire il reste réservé par le système, il n'est donc pas possible de récupérer cet espace avec un autre pointeur ????

    enfin voilà la récap <b>memwatch</b> qui fait plaisir :
    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
     
    ============= MEMWATCH 2.71 Copyright (C) 1992-1999 Johan Lindh =============
     
    Started at Tue Jul 15 10:38:20 2003
     
    Modes: __STDC__ 64-bit mwDWORD==(unsigned long)
    mwROUNDALLOC==8 sizeof(mwData)==32 mwDataSize==32
     
     
    Stopped at Tue Jul 15 10:43:44 2003
     
     
    Memory usage statistics (global):
     N)umber of allocations made: 20702
     L)argest memory usage      : 425454
     T)otal of all alloc() calls: 426163
     U)nfreed bytes totals      : 0
    Cela te donnes une idée de l'ampleur des free(s) non éffectués (cf mon précédent memwatch)

    Je promets d'être beaucoup beaucoup plus "attentif".

    La précipitation c'est comme la pluie plus y en a plus il y a de dégâts
    je ferais mieux la prochaine fois

  5. #25
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par danel
    Bref, je ne comprends pas bien l'effet de bord qui m'arrivait car il me semble que si je ne libère pas un espace mémoire il reste réservé par le système, il n'est donc pas possible de récupérer cet espace avec un autre pointeur ????
    Normallement non, mais si tu avais des wild free, c'est que tu free-ais sur de mauvais pointeurs ! Tu as du donc aussi enlever des free non ? Tu as juste ajouter un free(ptrTemp) ? Dans ce cas c'est plus qu'etrange.

    Enfin bon, tout ceci montre: que l'on peut toujours corriger du code (au prix de quelques recherches), en utilisant "correctement" les outils existant !

    Mais tu verras, plus ca ira, et plus tu ira vite pour trouver les bugs, a la fin, c'est comme un jeu

  6. #26
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par D[r
    eadLock]

    Enfin bon, tout ceci montre: que l'on peut toujours corriger du code (au prix de quelques recherches), en utilisant "correctement" les outils existant !

    Mais tu verras, plus ca ira, et plus tu ira vite pour trouver les bugs, a la fin, c'est comme un jeu
    Merci encore à tous pour vos conseils et votre patience...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/05/2014, 08h12
  2. Problème d'allocation mémoire sur requête Oracle.
    Par peaceinpal dans le forum JDBC
    Réponses: 2
    Dernier message: 02/08/2011, 09h41
  3. Problème de fuite mémoire sur un FLV
    Par p3ga5e dans le forum Flash
    Réponses: 0
    Dernier message: 05/10/2010, 16h15
  4. Problème libération de mémoire?
    Par Bartuk dans le forum C
    Réponses: 7
    Dernier message: 28/12/2005, 17h20
  5. Problème de fuite mémoire sur un idFTP
    Par jeromelef dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/07/2005, 17h29

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