Libération de la mémoire

Libération de la mémoire - C - Programmation

Marsh Posté le 09-08-2006 à 17:22:44    

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 :

Code :
  1. typedef struct noeud{
  2. int n;
  3. struct noeud **tab;
  4. }Noeud;
  5. typedef struct{
  6. Noeud *racine;
  7. }Graphe;


 
Comment s'écrirait la fonction int libérerGraphe(Graphe **g) permettant de libérer un graphe.
 
Merci

Reply

Marsh Posté le 09-08-2006 à 17:22:44   

Reply

Marsh Posté le 09-08-2006 à 17:26:35    

Tu dois libérer les pointeurs les plus profonds en remontant.
 
Dans le cas d'un graph, tu commence par les feuilles, etc.

Reply

Marsh Posté le 09-08-2006 à 17:31:47    

Pour compléter ce que dit _darkalt3_, en règle générale, il y a autant de free() que de ?alloc().

Message cité 1 fois
Message édité par Elmoricq le 09-08-2006 à 17:32:11
Reply

Marsh Posté le 09-08-2006 à 17:48:04    

Elmoricq a écrit :

Pour compléter ce que dit _darkalt3_, en règle générale, il y a autant de free() que de ?alloc().


 
 
  :pfff:  Oups !
 
 si tu fais un malloc, puis un realloc, tu n'as qu'un seul free, pas deux !
 

Reply

Marsh Posté le 09-08-2006 à 17:49:47    

pfuitt > realloc ne rentre pas dans le pattern ?alloc().
il n'a pas mis *alloc() ou +alloc() ;)

Reply

Marsh Posté le 09-08-2006 à 17:53:25    

pains-aux-raisins a écrit :

pfuitt > realloc ne rentre pas dans le pattern ?alloc().
il n'a pas mis *alloc() ou +alloc() ;)


autant pour moi !
 
me flagele avec des orties fraichement coupées
 
 
mais bon ...tendancieux comme conseil, n'est il pas ?
:)


Message édité par pfuitt le 09-08-2006 à 17:53:40
Reply

Marsh Posté le 09-08-2006 à 17:54:47    

Non, parce que realloc() est une fonction si particulière qu'un traitement particulier lui est réservé. ;)

Reply

Marsh Posté le 10-08-2006 à 11:07:25    

Dans le cas de mes structures, la libération du graphe, se fait de cette manière ?
 
MAXNOEUDS est le nombre de fils max que peut avoir un sommet

Code :
  1. int libereNoeud(Noeud *n){
  2.   int i;
  3.   for(i=0; i<MAXNOEUDS ;i++){
  4.     if((n->tab[i])!=NULL){
  5.       libereNoeud(n->tab[i]);
  6.       free(n->tab[i]);
  7.     }
  8.   }
  9.   free(n);
  10.   return 1;
  11. }
  12. int libereGraphe(Graphe **g)
  13. {
  14.   if(*g != NULL)
  15.     {
  16.       libereNoeud(*g->racine);
  17.       free(*g);
  18.     }
  19.  
  20.   free(g);
  21.   return 1;
  22. }


Message édité par Gattuso le 10-08-2006 à 11:08:41
Reply

Marsh Posté le 13-08-2006 à 12:16:45    

Je ne comprends pas pourquoi tu renvoies des valeurs qui ne sont pas utilisées.
D'autre part, j'aurais tendance à écrire libereNoeud((*g)->racine);

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed