GLib Malloced字符串作为哈希表的键

GLib Malloced字符串作为哈希表的键,c,glib,C,Glib,我使用malloc'd字符串作为GLib哈希表的键。然后我有几个更新要做。每次更新都使用一个新的malloced字符串,该字符串在实际的字符序列中是相同的。如果我插入,旧字符串会被覆盖吗?我怎样才能确保把它放出来,这样我就不会有多余的副本了?如果没有覆盖,我如何确保在不太慢的情况下实现更新?如果在创建哈希表时向g\u hash\u table\u new\u full提供了正确的比较器和键/值析构函数,则无需执行任何额外操作。该表将理解,即使键字符串是单独的副本,它们也是相同的,并且它也将自动释

我使用malloc'd字符串作为GLib哈希表的键。然后我有几个更新要做。每次更新都使用一个新的malloced字符串,该字符串在实际的字符序列中是相同的。如果我插入,旧字符串会被覆盖吗?我怎样才能确保把它放出来,这样我就不会有多余的副本了?如果没有覆盖,我如何确保在不太慢的情况下实现更新?

如果在创建哈希表时向
g\u hash\u table\u new\u full
提供了正确的比较器和键/值析构函数,则无需执行任何额外操作。该表将理解,即使键字符串是单独的副本,它们也是相同的,并且它也将自动释放相同键的重复副本

下面是一个示例(丑陋的
printf
s仅用于显示发生了什么):

首先编写析构函数:

然后实例化并使用
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

您将看到,如果您创建一个与现有键相同的“新”键,并尝试插入相应的“新”值,“插入”操作将自动销毁“新”键(因为它与现有键相同)以及旧值(因为必须用新值替换).

如果在创建哈希表时向
g\u hash\u table\u new\u full
提供了正确的比较器和键/值析构函数,则无需执行任何额外操作。该表将理解,即使键字符串是单独的副本,它们也是相同的,并且它也将自动释放相同键的重复副本

下面是一个示例(丑陋的
printf
s仅用于显示发生了什么):

首先编写析构函数:

然后实例化并使用
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

您将看到,如果您创建一个与现有键相同的“新”键,并尝试插入相应的“新”值,“插入”操作将自动销毁“新”键(因为它与现有键相同),以及旧值(因为必须用新值替换)。

使用,只有在使用创建哈希表时提供了
key\u destroy\u func
时,才会释放键值。如果使用创建哈希表,则必须在插入后释放键(如有必要)。

使用时,只有在使用创建哈希表时提供了
键\u destroy\u func
时,才会释放键值。如果使用创建哈希表,则必须在插入后释放键(如有必要)。

键和值是否为
malloc
ed字符串?您在创建哈希表时是否提供了一个
键\u destroy\u func
和一个
值\u destroy\u func
?是的,两者都是malloc'ed。我和led释放了自己。问题是,每次我尝试添加新记录时,键的字符串都是新的,即使文本的值相同。因此,这就像添加一个新密钥。我想知道我是否需要维护一个单独的索引并进行一些字符串比较。键和值
malloc
ed字符串吗?您在创建哈希表时是否提供了一个
键\u destroy\u func
和一个
值\u destroy\u func
?是的,两者都是malloc'ed。我和led释放了自己。问题是,每次我尝试添加新记录时,键的字符串都是新的,即使文本的值相同。因此,这就像添加一个新密钥。我想知道我是否需要维护一个单独的索引并进行一些字符串比较。太好了。我忽略了这个g_哈希表(新的)(满的),太好了。我忽略了这个g_哈希表(新的)(满的)。