segfault simplista tabla hash de g_free
Pregunta
No estoy seguro de por qué si lo intento de liberar a los datos me sale error de segmentación. Cualquier ayuda será lo aprecian.
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);
}
Solución
En este ejemplo que ha demostrado y la batalla sin fin para violación de segmento, usted no ha malloc'd o new'd la memoria para la variable de q
... por alguna razón se ha saltado muestra el código para add_inv
dentro de su main
función de memoria .... la clave está en el puntero a char es decir q
, tiene eso malloc
d ...
¿Ha tratado de esta manera:
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 fallo se produce cuando se trató de retirar la información de memoria que no ha de ser ni malloc
d new
d en función de C / C ++, respectivamente .... puede suceder si free
d o delete
d un puntero que no ha de ser free
d o new
d ....