2010-03-11 6 views
0

Je ne sais pas vraiment pourquoi, si j'essaie de libérer les données, je me suis trompé. Toute aide sera l'apprécier.Glib segfault g_free table de hachage

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

Répondre

0

Dans cet exemple que vous avez montré et la bataille sans fin pour segfault, vous n'avez pas malloc'd ou new'd la mémoire pour la q variables ... pour une raison quelconque vous avez sauté montrant le code add_inv au sein de votre fonction main .... l'indice est le pointeur vers un char-à-dire q, que cela a malloc d mémoire ...

Avez-vous essayé de cette façon:

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

Un seg-fault se produit lorsque vous essayez de dé-référencer la mémoire qui n'a pas malloc d ni new d en fonction de C/C++ respectivement .... cela peut arriver si vous free d ou delete un pointeur qui n'est pas free d ou new d ....

+0

Merci. J'ai fait comme vous l'avez indiqué et semble fonctionner. Maintenant, je peux supprimer cette entrée de la table de hachage g_hash_table_remove (hashtable, q); et g_free (old_key); mais pour une raison quelconque, g_free (old_value); donne segfault. – Mike

+0

@Mike: était old_value malloc'd ou new'd? – t0mm13b