[resolu] problème Libération de mémoire sur tableau de point
Bonjour,
Je tourne en rond, je ne comprends pas pourquoi je n'arrive pas à libérer les espaces mémoires que j'ai alloué.
Je vous explique :
j'ai une strucure :
Code:
1 2 3 4 5
|
typedef struct descriptif {
int intNbChampsCle;//nombre d'indice du tableau de pointeur
char **chrChampsCle;
}; |
Je déclare une variable de type structure descriptif et un pointeur :
Code:
struct descriptif desc_ref,*ptrDesc_ref;
j'affecte à mon pointeur l'adresse de ma variable
Code:
ptrDesc_ref=&desc_ref;
je passe à une fonction mon pointeur
Code:
F_descriptif(ptrDesc_ref,1);
dont le prototype est :
Code:
void F_descriptif(struct descriptif *desc,int type)
dans cette fonction j'alloue la mémoire et suivant un compteur je réalloue :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
if(desc->chrChampsCle == NULL) {
if ((desc->chrChampsCle=(char **)calloc( intNbChamp + 1, sizeof (char *))) == NULL) {
fprintf(stderr,"PROBLEME d'allocation de memoire [desc->chrChampsCle]\n");
exit (1);
}
} else {
if ((desc->chrChampsCle=(char **)realloc(desc->chrChampsCle,sizeof (char *) * (intNbChamp + 1))) == NULL) {
fprintf(stderr,"PROBLEME d'allocation de memoire [desc->chrChampsCle]\n");
exit (1);
}
} |
puis je récupère à l'indice précisé par le compteur un pointeur sur une chaine via une fonction :
Code:
1 2
|
desc->chrChampsCle[intNbChamp]=ExtractChaine(ptrChrBufferLect,ptrTemp); |
ce que fait la fonction :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
char * ExtractChaine(char *debut,char *fin) {
int intIndice;
int intLongueur;
char *ptrChrRetour;
intIndice=0;
intLongueur=fin-debut;
if ((ptrChrRetour = (char *) calloc(intLongueur+1,T_CHAR)) == NULL)
{
fprintf(stderr,"PROBLEME d'allocation de memoire [ptrChrRetour]\n");
exit (1);
}
for(intIndice=0;intIndice < intLongueur;intIndice++) {
ptrChrRetour[intIndice]=debut[intIndice];
}
ptrChrRetour[intIndice]='\0';
return ptrChrRetour;
} |
à la fin je libère les allocation faites :
Code:
1 2 3 4 5 6 7 8
|
for(intCompteur=0;intCompteur < desc_ref.intNbChampsCle;intCompteur++) {
if(desc_ref.chrChampsCle[intCompteur] != NULL) {
free(desc_ref.chrChampsCle[intCompteur]);
}
}
free(desc_ref.chrChampsCle); |
La fonction F_descriptif est utilisé 2 fois, la libération pour la 1ère utilisation fonctionne bien mais quand je termine la libération du dernier indice de la seconde utilisation j'ai une erreur :
Citation:
unhandled exception in monProg.exe : 0xC0000005 Access violation
Merci d'avance pour votre aide.
Re: problème Libération de mémoire sur tableau de pointeur
Code:
1 2 3 4 5 6
|
for(intCompteur=0;intCompteur < desc_ref.intNbChampsCle;intCompteur++) {
if(desc_ref.chrChampsCle[intCompteur] != NULL) {
free(desc_ref.chrChampsCle[intCompteur]);
}
} |
ici tu efface ce que tu as créé dynamiquement (calloc et malloc) or tu as bien créé une sructure en dur (struct decriptif desc_ref) or avec cette ligne tu essai de l'effacer :
Code:
1 2
|
free(desc_ref.chrChampsCle); |
je pense que ton erreur vient de la derniere ligne parceque tu essai d'effacer ton pointeur de pointeur qui a été créé avec la structure et nom dynamiquement. ce pointeur disparaitra en meme temps que la structure.Si elle a ete créée en static elle sera detruite en meme temps que le programme. Si elle a ete faite en dynamique il faut detruire la structure entiere et non juste le pointeur.
Re: problème Libération de mémoire sur tableau de pointeur
Citation:
Envoyé par kalifornication
je pense que ton erreur vient de la derniere ligne parceque tu essai d'effacer ton pointeur de pointeur qui a été créé avec la structure et nom dynamiquement. ce pointeur disparaitra en meme temps que la structure.Si elle a ete créée en static elle sera detruite en meme temps que le programme. Si elle a ete faite en dynamique il faut detruire la structure entiere et non juste le pointeur.
Je n'arrive même pas sur la dernière ligne.
L'erreur survient quand je libère le deuxième et dernier indice de mon tableau dans la structure dans la boucle for.
Je soupçonne ma fonction ExtractChaine, et c'est là que je pêche.
Est-ce qu'en faisant mon calloc dans cette fonction je récupère bien mon pointeur sur cette allocation.
J'ai tulisé cette méthode avec d'autres tableaux, et j'ai peur que le contexte fasse que je crois que cela marche mais qu'en réalité je pointe sur les bonnes valeurs par hasard.
Pour te dire ou j'en suis
:cry: