Désallocation structure

Fermé
rct1234fanBE Messages postés 3 Date d'inscription lundi 27 janvier 2014 Statut Membre Dernière intervention 27 mai 2015 - 12 mars 2014 à 18:33
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 12 mars 2014 à 23:00
Bonjour à tous (et éventuellement à toutes ;) ).

Voilà, je dois faire un projet pour lequel j'ai un structure implémentée comme un type opaque que j'arrive à allouer mais pas à dés-allouer ... Je vous explique le problème.

Ma structure est la suivante :

struct Piece{
int longueur; /*!< Longueur de la pièce, caractère '\0' non compté */
int hauteur; /*!< Hauteur de la pièce, caractère '\0' non compté */
char **represent_piece; /*!< Représentation graphique de la pièce */
};

J'alloue la mémoire nécessaire pour un tableau de 6 pièces avec cette fonction (sans les free) :

Piece *cree_tableau_pieces(){

Piece *p;
int i, j, hauteur, longueur;

//ETAPE 1 : On alloue 6 fois la structure [tab. de structure] car j'ai 6 pièces au total.

p=malloc(6*sizeof(Piece));
if(p==NULL)
return NULL;

//ETAPE 2 : Pour chaque cellule du tableau, on alloue le tableau de caractères

for(i=0; i<6 ;i++){

//Etape 2.1 : Chaque pièce possède une longueur et largeur différente (cfr. ReadMe pour la taille des pièces) !
if(i==3 || i==4 || i==5){
hauteur=2;
longueur=3;
}

if(i==0 || i==1){
hauteur=3;
longueur=2;
}

if(i==2){
hauteur=4;
longueur=1;
}

//Etape 2.2 : On alloue les lignes
p[i].represent_piece=malloc(hauteur*sizeof(char *));
if(p[i].represent_piece==NULL){

printf("Erreur lors de l'allocation des pièces\n");
exit(1);
}//fin du if

//Etape 2.3 : On alloue les colonnes
for(j=0; j<hauteur+1 ;j++){

p[i].represent_piece[j]=malloc((longueur+1)*sizeof(char));
if(p[i].represent_piece[j]==NULL){

printf("Erreur lors de l'allocation des pièces\n");
exit(1);

}

}//fin du for

//ETAPE 3 : On attribue la hauteur et la longueur à p[i]
p[i].hauteur=hauteur;
p[i].longueur=longueur;


}// fin du 'for' qui parcours toutes les cellules de 'p'

//ETAPE 4 : On complète les chaînes de caractère de chacunes des pièces

//Etape 4.1 : pièce 0
p[0].represent_piece[0]="# ";
p[0].represent_piece[1]="# ";
p[0].represent_piece[2]="##";

//Etape 4.2 : pièce 1
p[1].represent_piece[0]=" #";
p[1].represent_piece[1]=" #";
p[1].represent_piece[2]="##";

//Etape 4.3 : pièce 2
p[2].represent_piece[0]="#";
p[2].represent_piece[1]="#";
p[2].represent_piece[2]="#";
p[2].represent_piece[3]="#";

//Etape 4.4 : pièce 3
p[3].represent_piece[0]="# ";
p[3].represent_piece[1]="###";

//Etape 4.5 : pièce 4
p[4].represent_piece[0]=" # ";
p[4].represent_piece[1]="###";

//Etape 4.6 : pièce 5
p[5].represent_piece[0]=" # ";
p[5].represent_piece[1]="###";


return p; //On renvoie le pointeur sur Piece

}// Fin de la fonction cree_tableau_pieces


L'allocation se déroule bien, il y a bien sur des fuites mémoire lorsque p[i]. ... =NULL vu que je n'ai pas mis les free !

Venons en à la dés-allocation.

Pour désallouer le tableau de caractères de ces pièces, il m'a semblé logique d'utiliser cette fonction :
http://hpics.li/1d086a0

Mais j'obtiens cette grosse erreur-ci :
http://www.hostingpics.net/viewer.php?id=836887Capturedu20140312182539.png

Pourtant je passe bien à free un pointeur sur char ! :'( help please.

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
12 mars 2014 à 23:00
Il y a des fuites mémoires même p[i]...!=NULL.
L'erreur vient des affectations.

p[4].represent_piece[0]=" # ";
Fuite mémoire. Il faut utiliser strcpy(p[4].represent_piece[0]," # "); (et pareil pour les autres).

Pour les free() je n'ai pas regardé ce que tu as fait. Mais il suffit de faire les malloc() en sens inverse.
0