Bonjour
J'asseye de faire un programme qui lit un fichier texte et qui met les mots dans une liste simplement chaînée. Un mot par noeud.
En surface mon programme fonctionne correctement, seulement lorsque j'utilise valgrind pour verifier les fuites de mémoire, je m'aperçoit que je ne gère pas ma memoire convenablement.
En gros, je pene que strdup créé dynamiquement un pointeur vers une chaine de caractères pour chaque mot. Donc si mon fichier texte à 40 mots, il va y avoir 40 zones mémoires dynamiques que je dois effacer.
J'ai asseye de mettre le contenu du strdup dans un char * par exemple, et de faire free() sur cela à différents endroits. Résultat soit que j'ai une fuite de mémoire, soit que j'efface le pointeur trop top et il manque des mots dans ma liste.
Comment puis-je éviter les fuites avec strdup ?
Merci!
Mon main :
Ma structure pour ma liste chainée :
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 int main(int argc, char **argv) { llist ma_liste = NULL; char tampon_mot[100]; FILE *file = fopen("fichier.txt", "r"); if(file == NULL) { printf("erreur ouverture de fichier\n"); return 1; } while(fscanf(file, "%s", tampon_mot) == 1){ ma_liste = ajouterEnTete(ma_liste, strdup(tampon_mot)); } fclose(file); afficher_liste(ma_liste); effacerListe(ma_liste); return 0; }
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
41
42
43
44 typedef struct element element; struct element { char * val; struct element *nxt; }; typedef element* llist; llist ajouterEnTete(llist liste, char * valeur) { element* nouvelElement = malloc(sizeof(element)); nouvelElement->val = valeur; nouvelElement->nxt = liste; return nouvelElement; } void afficherListe(llist liste) { element *tmp = liste; while(tmp != NULL) { printf("%s ", tmp->val); tmp = tmp->nxt; } printf("\n"); } llist effacerListe(llist liste) { if(liste == NULL) { return NULL; } else { element *tmp; tmp = liste->nxt; free(liste); return effacerListe(tmp); } }
Partager