|
|
|
|
Bonjour,
je voudrais savoir comment se passe la libération de la mémoire pour des char **, char ***, struct nom **, etc
Par exemple, dans mon cas, j'ai 2 structures :
typedef struct noeud{
int n;
struct noeud **tab;
}Noeud;
typedef struct{
Noeud *racine;
}Graphe;
int libérerGraphe(Graphe **g)permettant de libérer un graphe.
Salut.
int *n; n=(int *)malloc(sizeof(int)*k);Alors pour libérer la mémoire tu fais for (i=0 ; i<k ; i++) free(n[i]);Le principe est le même pour des int ** mais avec une double boucle et un free sur n[i][j]. Pour libérer un graphe, utilises les pointeurs (2 ici). Tu fais un free sur le premier élément, mais un pointeur garde l'adresse de l'élément suivant en mémoire. Et tu continues à boucler tant que le pointeur qui indique l'élément suivant n'est pas NULL. Bon courage ! T'as pensé à regarder sur Google avant de poser ta question ? |
En fait c'est presque ça mais tu n'as pas tout désalloué. Supposons qu'on ait une matrice de pointeurs int*, la matrice est donc un int***. On va mettre tout ça dans une structure permettant de connaître le nombre de ligne et de colonne.
struct matrix{
int ***data; // une matrice 2D de int *
unsigned int nb_lig; // nb de ligne
unsigned int nb_col; // nb de colonne
};
Ensuite il faut : 1) désallouer les int * 2) désallouer les int ** (chaque tableau correspondant à une ligne de matrice) 3) désallouer le int *** (le tableau de lignes)
struct matrix m;
//je remplis m, en tenant à jour m.nb_lig et m.nb_col
// ...
// et je désalloue
for(i=0;i<nb_lig;++i){
for(j=0;j<nb_col;++j){
free(m[i][j]); // je désalloue le int * m[i][j]
}
free(m[i]); // je désalloue le int ** (la ligne m[i])
}
free(m); // je désalloue le int *** qui pointe désormais sur une zone vide
Bonne chance |
Ben je vois pas quand est ce que tu desalloues les "intermédiaires" alors... C'est simple en C à chaque malloc, tu dois associer un free. Vu que tu as mallocé les intermédiaires tu dois les libérer... En cas de doute tu peux utiliser par exemple valgrind pour vérifier si tu libères toute la mémoire.
|
Dans le cas de mes structures, la libération du graphe, se fait de cette manière ?
int libereNoeud(Noeud *n){
int i;
for(i=0; i<MAXNOEUDS ;i++){
if((n->tab[i])!=NULL){
libereNoeud(n->tab[i]);
free(n->tab[i]);
}
}
free(n);
return 1;
}
int libereGraphe(Graphe **g)
{
if(*g != NULL)
{
libereNoeud(*g->racine);
free(*g);
}
free(g);
return 1;
} |
J'aime pas trop la récursivité dans une boucle for personnellement ... Tu t'es embrouillé les pinceaux la :)
void libereListe(liste *ptr)
{
pt_suivant = ptr->ptsuiv
while ( pt_suivant != NULL)
{
pt_var = pt_suivant;
free(pt_var);
pt_suivant = pt_suivant->ptsuiv;
}
free(ptr);
}Si ta liste a comme pointeur suivant ptsuiv. Il ne te reste plus qu'à garder cette philosophie ... Mais un simple while suffit !
T'as pensé à regarder sur Google avant de poser ta question ?
|
Je suis assez d'accord. Je pense qu'il a dû repartir d'une structure d'arbre. Pour moi un graphe c'est :
|