1

私はGLibハッシュテーブルへのキーとしてmallocされた文字列を使用しています。次に、いくつかの更新を行います。各更新では、実際の文字シーケンスと同じである、新しくマロックされた文字列が使用されます。挿入すると、古い文字列は上書きされますか?余分なコピーを残さないように、どうすれば確実に解放できますか?上書きされていない場合、遅すぎずに更新を実装するにはどうすればよいですか?

4

2 に答える 2

5

ハッシュテーブルを作成するときに正しいコンパレータとキー/値デストラクタを指定すれば、特別なg_hash_table_new_fullことをする必要はありませ。テーブルは、キー文字列が別々のコピーであっても同じであることを理解し、同じキーの繰り返しコピーも自動的に解放します。

ここに例があります(醜いprintfは何が起こっているかを示すためだけにあります):

まず、デストラクタを作成します。

void
free_data (gpointer data)
{
  printf ("freeing: %s %p\n", (char *) data, data);
  free (data);
}

GHashTable次に、インスタンス化して、 :で遊んでください。

int main (void)
{
  char *key, *val;
  GHashTable *hash_table
  = g_hash_table_new_full (g_str_hash,  /* Hash function  */
                           g_str_equal, /* Comparator     */
                           free_data,   /* Key destructor */
                           free_data);  /* Val destructor */
  /* Insert 'k_1' */
  key = strdup ("k_1");
  printf ("%s %p\n", key, key);
  val = strdup ("v_1");
  printf ("%s %p\n", val, val);

  printf ("inserting\n");
  g_hash_table_insert (hash_table, key, val);
  printf ("insert finished\n");

  /* Insert 'k_1' again using new strings */
  key = strdup ("k_1");
  printf ("%s %p\n", key, key);
  val = strdup ("new_v_1");
  printf ("%s %p\n", val, val);

  printf ("inserting\n");
  g_hash_table_insert (hash_table, key, val);
  printf ("insert finished\n");

  g_hash_table_unref (hash_table);

  return 0;
}

テスト実行は次のようになります。

k_1 0x80cce70
v_1 0x80cce80
inserting
insert finished
k_1 0x80cce90
new_v_1 0x80ccea0
inserting
freeing: k_1 0x80cce90
freeing: v_1 0x80cce80
insert finished
freeing: k_1 0x80cce70
freeing: new_v_1 0x80ccea0

既存のキーと同じ「新しい」キーを作成し、対応する「新しい」値を挿入しようとすると、「挿入」操作によって「新しい」キーが自動的に破棄されることがわかります(これ、既存の値)、および古い値(新しい値に置き換える必要があるため)。

于 2012-10-03T20:30:10.117 に答える
1

を使用すると、でハッシュテーブルを作成g_hash_table_insert ()するときにを指定した場合にのみ、キー値が解放されます。でハッシュテーブルを作成した場合は、必要に応じて、挿入後にキーを解放する必要があります。key_destroy_funcg_hash_table_new_fullg_hash_table_new

于 2012-10-03T20:30:42.987 に答える