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