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

あなたが示したこの例とsegfaultの無限の戦いでは、変数のメモリをmallocまたはnewしていませんq...何らかの理由add_invで、関数内のコードの表示をスキップしましたmain....手がかりは char へのポインターにあります。つまり、 d メモリqを取得しています...malloc

この方法で試しましたか:

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); /* これで q にメモリが割り当てられました! */

  add_inv(q); /* これでうまくいくはずです */

  g_hash_table_destroy(ハッシュテーブル);
}

seg-fault は、C/C++ に応じてそれぞれmallocd またはd ではないメモリを逆参照しようとすると発生します。d またはdでないポインターをd またはda すると発生する可能性があります。newfreedeletefreenew

于 2010-03-11T19:16:36.950 に答える