【问题标题】:How to correctly free a GHashTable of structs如何正确释放结构的 GHashTable
【发布时间】:2020-12-13 23:13:51
【问题描述】:

我不知道如何释放所有使用的内存,尤其是对于 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 故障的原因?

【问题讨论】:

  • 这是错字吗? person1->name = g->strdup(name);
  • 离题:if (NULL == person) 通常写作if (person == NULL)。 (将对象与期望值进行比较,而不是将期望值与对象进行比较。)
  • 这是一种风格选择——有些人提倡NULL == person,这样如果你不小心遗漏了第二个=,代码就无法编译。
  • 是的,ryyker,是一个小贴士,我用手机写了这个问题。
  • 编译器几十年来一直能够警告if 语句中的意外分配。 NULL == person 现在纯粹是一种风格选择,而不是更安全的选择。

标签: c dynamic-memory-allocation glib


【解决方案1】:

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

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

【讨论】:

  • 番茄,谢谢你的回答。所以,因为 person1 变量引用了相同的内存区域,所以也将是空闲的,理解。将其设置为 NULL 也是一个好习惯?
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 2023-03-10
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多