2010-03-11 100 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