使用g_hash_table_new_full丢失信息

时间:2018-05-03 10:49:04

标签: c malloc free glib

在我正在进行的项目中,在我的主要结构中,我使用g_hash_table_new_full来保存/排序某些信息,以便快速访问。

这是我在哈希

中使用的结构
struct post {
    char* title;
    char* tags;
    long  id;
    long  parent_id;
    long  user_id;
    long best_answer_id;
    float best_answer_score;
    int   score;
    int reply_number;
};

我使用以下行创建哈希:

    GHashTable* g_hash_table_posts = g_hash_table_new_full(g_int_hash, g_int_equal , NULL , &free_post);

我传递NULL作为第三个参数,因为键很长,所以我不需要释放它。我的free_post函数是我用来释放帖子的函数:

void free_post(void* rip) {
    POST p = (POST) rip;
    if(p) {
    free(p->title);
    free(p->tags);
    free(p);
  }
}

因为我分配的唯一东西是字符串,我只释放它们然后自己的结构。

现在的问题是,当我使用帖子ID进行g_hash_table_lookup时,我只能提供那些有问题的人(parentId = -1),当我寻找一个是answear时(parentID!= -1) )它返回NULL,因为它无法找到它。 如果我从free(p)函数中删除free_post部分,它可以正常工作。

我无法理解为什么因为这个函数甚至不应该被投射,它只应该在我投射g_hash_table_destroy时使用,我还没有使用它。那我为什么要丢失信息?

1 个答案:

答案 0 :(得分:1)

问题解决了。问题是,如果在创建数组时给出了函数g_hash_replaceg_hash_insert(如果密钥已经存在的话)将使用自由函数。

所以我的问题是,当我更换一些价值时,我实际上正在摧毁我在那里的东西。希望如果有人遇到同样的问题,这会有所帮助:)