如何正确释放结构的 GHashTable

How to correctly free a GHashTable of structs

我不知道如何释放所有使用的内存,尤其是 GHashTable。 我有这样的东西:

struct person 
{ 
   char *name;
   int age; 
};

void free_person(gpointer p){
    struct *address person = p;
    if (NULL == person)
        return;
    if(NULL != person->name)
       g_free(person->name);
    g_free(person);
}

And in main:

GHashTable *persons_info list = g_hash_table_new_full(..., ... , NULL, free_person);
struct person * person1 = g_try_malloc0(sizeof(struct person));
person1->age = 20;
char *name = g_strdup("Raul");
person1->name = g->strdup(name);
g_hash_table_insert(list, 2, person1);
 //Now for free...

g_hash_table_destroy(list);
list = NULL;

//Or g_hash_table_unref(list); ?
 
//What about person1 and name? //Should be Fred or just set to Null?

//If I add the following 2 lines sometimes I got sgm fault
free_person(person1):
person1 = NULL;


如果我释放变量 person 1,有人知道 sgm 错误的原因吗?

如果使用 g_hash_table_new_full() 创建,则 g_hash_table_destroy() 将对散列 table 中的所有键和值调用提供的键自由函数和值自由函数。所以你不必自己释放它们。如果你这样做,那么你将释放它们两次,这就是你得到段错误的原因。

如果你使用了g_hash_table_new(),或者你给了NULL作为键自由函数and/or值自由函数,那么你必须自己释放它们。