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