Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
LINUX & OPEN SOURCE
21 mai 2011

Un complément à hdestroy_r pour libérer la mémoire.

Le problème de hdestroy_r, c'est qu'il ne libére pas la mémoire qui a été allouée pour y stocker les clés et les données ( comme par exemple: entry.key = strdup(motcle); entry.data = strdup(donnee); ).

Une première solution est de créer une table qui contiendra les clés et les données, et ainsi de ne fournir à entry.key et entry.data que les pointeurs sur cette table, ainsi: entry.key=key_tab[i]; entry.data=data_tab[i]; 

Une deuxième solution est d'exploiter la structure hsearch_data pour accéder directement à la table d'indexes, et en particulier à htab->table[i].used . On y trouve un entier qui vaut 0 lorsqu'il n'y a pas d'enregistrement. Il suffit donc de tester cette valeur pour savoir s'il y a une entrée ou non à cet emplacement.  Il reste ensuite à libérer les emplacements pointés par htab->table[i].entry.key et htab->table[i].entry.data avec un free(). Voiçi la partie de code qui fait ce boulot:

////////////////////////////////////////////////////////////////////////////////////////////////////////
//on accède aux variables utilisées par hsearch_r.c
//htab->size donne la dimension de la table
//htab->used c'est la valeur après hachage, vaut 0 si libre
//htab->entry la structure key et data
//limitation: veillez aux changements dans hsearch_r.c
//////////////////////////////////////////////////////////////////////////////////////////////////////

typedef struct _ENTRY
{

  unsigned int used;

  ENTRY entry;

}  _ENTRY;

 

int hdesallocate_r(struct hsearch_data *htab) {

  int i;  

  for(i=0;isize;i++)

    if (htab->table[i].used)

    {

        free(htab->table[i].entry.key);

        free(htab->table[i].entry.data);

    }

   return 1;

}

Exemple de programme qui exploite la fonction h_dessallocate_r() est ici: hashposix_txt  

   

Publicité
Publicité
Commentaires
LINUX & OPEN SOURCE
Publicité
Archives
Publicité