В проекте, над которым я работаю, в своей основной структуре я использую 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);
}
}
Поскольку единственное, что я выделяю, это строки, я только освобождаю их, а затем саму структуру.
Теперь проблема в том, что когда я делаю g_hash_table_lookup
с идентификатором записи, я могу кормить только тех, у кого есть вопросы (parentId = -1), когда я ищу тот, который является ответом (parentID! = -1). возвращает NULL, поскольку не может найти его.
Если я удаляю часть free(p)
из функции free_post
, она работает просто отлично.
Я не могу понять, почему с тех пор эту функцию не следует даже вызывать, ее следует использовать только тогда, когда я разыграю g_hash_table_destroy, которую я не использовал. Так почему я теряю информацию?