开发者

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 mallocd 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 mallocd nor newd depending on C/C++ respectively....it can happen if you freed or deleted a pointer that has not being freed or newd....

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜