0 votos

Glib segfault g_free tabla hash

No sé muy bien por qué si intento liberar los datos me sale un segfault. Cualquier ayuda será apreciada.

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

0voto

t0mm13b Puntos 21031

En este ejemplo que has mostrado y la interminable batalla por el segfault, no has malloc'd o new'd la memoria para la variable q ...por alguna razón has omitido mostrar el código de add_inv dentro de su main función.... la pista está en el puntero a char es decir q ¿tiene eso que malloc d memoria...

¿Lo has probado 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);
}

Se produce un fallo de segmento cuando se intenta desreferenciar una memoria que no ha sido malloc d ni new d dependiendo de C/C++ respectivamente....puede ocurrir si free d o delete d un puntero que no ha sido free d o new d....

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X