Glib segfault g_free哈希表

时间:2010-03-11 19:04:10

标签: c glib

我不太清楚为什么如果我尝试释放数据我会遇到段错误。任何帮助都会很感激。

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 :(得分:0)

在这个你已经展示过的例子和对segfault的无休止的争夺中,你没有对变量q进行malloc或新的内存...由于某种原因你跳过显示代码add_inv函数中的main ....线索指向char 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的内存时,会发生seg-fault,具体取决于C / C ++ ....如果你{{{ 1}} d或free da指针,但不是delete d或free d ....