glib是否在删除时散列哈希表?

时间:2013-11-28 07:52:12

标签: c hashmap glib

好吧,对此的答案可能很明显,但如果我理解正确,我就不会得到他们的推理。来自GHashTable上的glib文档:

g_hash_table_new_full ()

Creates a new GHashTable like g_hash_table_new() with a reference count of 1
and allows to specify functions to free the memory allocated for the key and
value that get called when removing the entry from the GHashTable.

好吧,公平。但是g_hash_table_new的处理是什么?它是否自动释放简单数据(字符串等),如果没有,这种危险和泄漏功能的用例是什么?是针对数据写入但从未删除过的有限使用情况吗?

3 个答案:

答案 0 :(得分:3)

在您有机会致电malloc之前,当您致电free并忘记返回值时,会发生泄漏。这与哈希表先验无关。

有一个将字符串文字映射到整数的哈希表是完全合理的,例如,在这种情况下,用户根本不会调用malloc。然后,没有必要明确指定删除函数,什么也不做。

答案 1 :(得分:2)

根据https://git.gnome.org/browse/glib/tree/glib/ghash.c?id=eff8f7511e08c73425fa65c9eaceb7dacf456f7a#n106g_hash_table_new()g_hash_table_new_full取消分配方法相同,因此不会执行释放。

如果您在需要解除分配的数据上使用该函数,则该函数是危险的/泄漏的。 当你的键/值是值(向指针强制转换)或在其他地方管理的内存(例如,指向mmapped文件的指针,或者用于管理不同的数据结构数组)时,它是非泄漏的。 / p>

根据C标准,这是非常无害的。

答案 2 :(得分:2)

它不是真正的泄漏,除非你忘记释放数据(这几乎是一个重言式: - ))。

您可能认为所有哈希表都应使用已分配的字符串并使用g_str_hash作为哈希函数。

GHashTable可以使用各种类型的密钥。从来没有关键需要被释放 - 例如,如果你将NULL传递给哈希函数(或g_direct_hash,这是完全相同的事情)那么你使用内存地址作为键,所以你不要有任何东西可以释放 - 即你没有泄露记忆。

如果您在GHashTable内部存储了复杂的数据结构,例如:

还存在将值存储在值数据中的情况。
typedef struct { char *foo; int bar; double baz; } Value;

GHashTable *table;
Value *value;

table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, free_value);

// fill up the Value data structure
value = value_init (value_alloc (), "foo", 42, M_PI / 4.0);

g_hash_table_insert (table, value->foo, value);

每次插入和删除时,将密钥从数据结构中复制出来是毫无意义的(可能还有性能或内存使用问题)。