C 如何正确释放结构的GHashTable

C 如何正确释放结构的GHashTable,c,dynamic-memory-allocation,glib,C,Dynamic Memory Allocation,Glib,我不知道如何释放所有使用的内存,尤其是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->n

我不知道如何释放所有使用的内存,尤其是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\u hash\u table\u new\u full()
创建,则
g\u hash\u table\u destroy()
将对哈希表中的所有键和值调用提供的无键函数和无值函数。所以你不必自己去释放他们。如果你这样做了,那么你将释放他们两次,这就是为什么你得到了错误


如果您使用了
g\u hash\u table\u new()
,或者将
NULL
作为无键函数和/或无值函数,那么您必须自己释放它们。

这是打字错误吗<代码>人员1->name=g->strdup(姓名)非主题:
if(NULL==person)
通常会写入
if(person==NULL)
。(将对象与预期值进行比较,而不是将预期值与对象进行比较。)这是一种风格选择——有些人主张
NULL==person
,因此如果你不小心遗漏了第二个
=
,代码将无法编译。是的,Ryker是tipo,我在手机上写下了这个问题。几十年来,编译器一直能够在
if
语句中警告意外的赋值
NULL==person
现在纯粹是一种风格选择,而不是一种更安全的选择。托马托,谢谢你的回答。因此,因为person1变量引用相同的内存区域,所以也将是空闲的,可以理解。将其设置为NULL也是一种好的做法?