Glib segfault g_free хеш-таблица - PullRequest
       5

Glib segfault g_free хеш-таблица

0 голосов
/ 11 марта 2010

Я не совсем уверен, почему, если я пытаюсь освободить данные, я получаю segfault. Любая помощь будет признательна.

struct mystu {
  char *q;
};

static GHashTable *hashtable;

static void add_inv(char *q)
{
    gpointer old_key, old_value;

    if(!g_hash_table_lookup_extended(hashtable, q, &old_key, &old_value)){
        g_hash_table_insert(hashtable, g_strdup(q), GINT_TO_POINTER(10));
    }else{
        (old_value)++;
        g_hash_table_insert(hashtable, g_strdup(q), old_value);
        g_hash_table_remove (hashtable, q); // segfault
        g_free(old_key);   // segfault
        g_free(old_value); // segfault
    }   
}
...
int main(int argc, char *argv[]){
  hashtable = g_hash_table_new(g_str_hash, g_str_equal);
  ...
  struct mystu stu;
  add_inv(stu.q);
  g_hash_table_destroy(hashtable);
}

1 Ответ

0 голосов
/ 11 марта 2010

В этом примере, который вы показали, и в бесконечной битве за segfault вы не запустили malloc или new'd память для переменной q ... по какой-то причине вы пропустили показ кода для add_inv в вашей main функции .... ключ находится в указателе на символ, то есть q, у которого есть malloc d память ...

Вы пробовали это так:

int main(int argc, char *argv[]){
  const char *qInit = "foo";
  char *q;
  hashtable = g_hash_table_new(g_str_hash, g_str_equal);
  ...
  q = strdup(qInit); /* Now q has memory allocated! */

  add_inv(q); /* This should work */

  g_hash_table_destroy(hashtable);
}

Ошибка сегмента возникает, когда вы пытаетесь отменить ссылку на память, которая не имеет malloc d или new d в зависимости от C / C ++ соответственно .... это может произойти, если вы free d или delete указатель da, который не является free d или new d ....

...