Bonjour,
j'aurais besoin de votre aide au sujet d'une fonction que je lance en boucle et qui dans le premier cas me provoque des "Segmentation fault" dans certains cas ; cela apparaît toujours si je ne mets pas la variable MALLOC_CHECK_ à 0, et parfois si je la mets à 0.
Je soupçonne des fuites mémoire ("memory leak") et le problème se situe au niveau de l'allocation mémoire (fonction realloc() ci-dessous). Si je lance mon programme avec valgrind, il marche à tous les coups (avec MALLOC_CHECK_ à 0).
J'ai des "memory leak" apparemment.
Voici le code de la fonction :
Cette fonction est utilisée dans une boucle d'un programme (qui est trop volumineux pour être mis ici).
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 int remplir_tab_nom_gros_fichier(char *nom_fic,St_fichier **tableau_fichier,int arch_status,int nbre_champ_A2) { St_fichier *tab_fichier; if (nbre_champ_A2 >0) { fprintf(stdout,"nbre_champ_A2=%d\n",nbre_champ_A2); if ( (*tableau_fichier = (St_fichier *)realloc(*tableau_fichier,sizeof(St_fichier)*((nbre_champ_A2) + 1))) == NULL) { fprintf(stderr,"Pb reallocation memoire tab_tampon dans la fonction 'remplir_tab_gros_fichier()'\n"); return(0); } } tab_fichier= *tableau_fichier; strcpy(tab_fichier[nbre_champ_A2].nom_fic,nom_fic); tab_fichier[nbre_champ_A2].arch_status = arch_status; return(1); }
1ere question : pourquoi ça plante?
Ensuite, si je réécris cette fonction de la manière suivante :
Je n'ai plus de plantage, en revanche, ce qui me chagrine c'est que j'alloue de la mémoire (donc pas de réallocation) et j'ai l'impression que je ne libère rien (quoi libérer et où?), et donc j'utilise beaucoup de mémoire au final.
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 int remplir_tab_nom_gros_fichier(char *nom_fic,St_fichier **tableau_fichier,int arch_status,int nbre_champ_A2) { St_fichier *tab_fichier; St_fichier *ptemp=NULL; if (nbre_champ_A2 >0) { ptemp = (St_fichier *) malloc(sizeof(St_fichier)*((nbre_champ_A2) + 1)); if (ptemp==NULL) { fprintf(stderr,"Pb reallocation memoire dans la fonction 'remplir_tab_gros_fichier()'\n"); free(ptemp); return(0); } else *tableau_fichier=ptemp; } tab_fichier = *tableau_fichier; strcpy(tab_fichier[nbre_champ_A2].nom_fic,nom_fic); tab_fichier[nbre_champ_A2].arch_status = arch_status; return(1); }
Bref je préfèrerais utiliser le realloc() mais j'ai tout essayé et impossible que ça ne plante pas.
Merci pour votre aide
Y.
Partager