在我正在进行的项目中,在我的主要结构中,我使用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时使用,我还没有使用它。那我为什么要丢失信息?
答案 0 :(得分:1)
问题解决了。问题是,如果在创建数组时给出了函数g_hash_replace
和g_hash_insert
(如果密钥已经存在的话)将使用自由函数。
所以我的问题是,当我更换一些价值时,我实际上正在摧毁我在那里的东西。希望如果有人遇到同样的问题,这会有所帮助:)