2010-03-11 54 views
0

我不太確定爲什麼如果我嘗試釋放數據,我得到段錯誤。任何幫助將不勝感激。Glib段錯誤g_free哈希表

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); 
} 

回答

0

在這個例子中,你表現出和段錯誤的無盡戰場,你有沒有malloc分配或new'd內存爲變量q ...由於某種原因,你跳過顯示的代碼您main函數中add_inv ....線索是關於字符指針即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); 
} 

當您嘗試取消引用的存儲器時,會出現段錯誤,這些存儲器不是分別取決於C/C++的malloc d也不是new d ....如果free d或delete da指針不是free d或new d ....

+0

謝謝。我按你的說法做了,似乎在工作。現在我可以從哈希表中刪除該條目g_hash_table_remove(hashtable,q);和g_free(old_key);但由於某種原因g_free(old_value);給段錯誤。 – Mike 2010-03-11 19:54:26

+0

@Mike:old_value malloc'd或new'd? – t0mm13b 2010-03-11 21:22:28