Glib segfault g_free hash table
I'm not quite sure why if I try to free the data I get segfault. Any help will be appreciate it.
struct mystu {
char *q;
};
static GHashTable *hashtable;
static void add_i开发者_JAVA百科nv(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);
}
In this example that you have shown and the endless battle for segfault, you have not malloc'd or new'd the memory for the variable q
...for some reason you have skipped showing the code for add_inv
within your main
function.... the clue is on the pointer to char i.e. q
, has that got malloc
d memory...
Have you tried it this way:
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); }
A seg-fault occurs when you tried to de-reference memory that has not being malloc
d nor new
d depending on C/C++ respectively....it can happen if you free
d or delete
d a pointer that has not being free
d or new
d....
精彩评论