Потеря информации с помощью g_hash_table_new_full - PullRequest
0 голосов
/ 03 мая 2018

В проекте, над которым я работаю, в своей основной структуре я использую 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, которую я не использовал. Так почему я теряю информацию?

1 Ответ

0 голосов
/ 04 мая 2018

Проблема решена. Проблема заключалась в том, что функции g_hash_replace и g_hash_insert (в случае уже существующего ключа) будут использовать функцию free, если она указана при создании массива.

Так что моя проблема заключалась в том, что когда я заменял какое-то значение, я фактически разрушал то, что у меня было там. Надеюсь, это поможет, если у кого-то возникнет такая же проблема :)

...