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)).
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.Envoyé par D[r
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.Envoyé par danel
Si tu fais :
avec Extract qui alloue le pointeur renvoye,
Code : Sélectionner tout - Visualiser dans une fenêtre à part desc->chrChampsCle[intNbChamp]=ExtractChaine(ptrChrBufferLect,ptrTemp);
et
La chaine allouee par Extract est bien liberee.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 free(desc->chrChampsCle[intIndice]);
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
questions subsidiaires :
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...
- 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).
OKAY je prends noteEnvoyé par D[r
#define T_CHAR sizeof(char)Envoyé par D[r
Oui je me le demande...Envoyé par D[r
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 :
Et voilà le travail....
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;
j'ai donc rajouté :
En plus pour la petite histoire j'avais mal utilisé memwtach j'avais oublié l'include
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 free(ptrTemp);
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 :
Cela te donnes une idée de l'ampleur des free(s) non éffectués (cf mon précédent memwatch)
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
Je promets d'être beaucoup beaucoup plus "attentif".
je ferais mieux la prochaine foisLa précipitation c'est comme la pluie plus y en a plus il y a de dégâts
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.Envoyé par danel
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...Envoyé par D[r
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager