0

我不太清楚为什么如果我尝试释放数据会出现段错误。任何帮助将不胜感激。

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

1 回答 1

0

在这个例子中,你已经展示了无休止的段错误之战,你没有 malloc'd 或 new'd 变量的内存q......由于某种原因你已经跳过add_inv在你的main函数中显示代码......线索在指向 char ie 的指针上q,是否有mallocd 内存...

你有没有试过这样:

int main(int argc, char *argv[]){
  const char *qInit = "foo";
  字符 *q;
  哈希表 = g_hash_table_new(g_str_hash, g_str_equal);
  ...
  q = strdup(qInit); /* 现在 q 已经分配了内存!*/

  add_inv(q); /* 这应该可以工作 */

  g_hash_table_destroy(哈希表);
}

当您尝试根据 C/C++ 分别取消引用既不是mallocd 也不是 d 的内存时,会发生段错误new......如果您的freed 或deleteda 指针不是freed 或newd....

于 2010-03-11T19:16:36.950 回答