由于memory pools (g_slice)
,我在代码中获得了possibly lost
。我的问题是:我的代码中有什么可以避免泄漏的,或者这纯粹是一个GLib问题吗?
所有这些都被报告为“可能丢失”。
==2552==
==2552== 744 bytes in 3 blocks are possibly lost in loss record 6 of 8
==2552== at 0x40235BE: memalign (vg_replace_malloc.c:694)
==2552== by 0x402361B: posix_memalign (vg_replace_malloc.c:835)
==2552== by 0x408693E: ??? (in /usr/lib/libglib-2.0.so.0.1600.6)
==2552== by 0x4088112: g_slice_alloc (in /usr/lib/libglib-2.0.so.0.1600.6)
==2552== by 0x405B503: ??? (in /usr/lib/libglib-2.0.so.0.1600.6)
==2552== by 0x804876C: add_inv (in /home/user/a.out)
==2552== by 0x8048818: main (in /home/user/a.out)
#include <glib.h>
static GHashTable *hashtable1;
static GHashTable *hashtable2;
int add_inv (char *a, char *b) {
GHashTable *table = NULL;
gpointer old_value;
char *mykey = NULL;
int i, plus, *pointer;
for (i = 0; i < 2; i++)
{
if (i == 0)
{
table = hashtable1;
mykey = a;
}
else if (i == 1)
{
table = hashtable2;
mykey = b;
}
old_value = g_hash_table_lookup (table, mykey);
if (old_value != NULL)
{
pointer = (int *) old_value;
plus = *pointer + 10;
}
else
plus = 10;
pointer = g_malloc (sizeof (int));
*pointer = plus;
g_hash_table_replace (table, g_strdup (mykey), pointer);
}
}
int main () {
int i;
hashtable1 = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, g_free);
hashtable2 = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, g_free);
for (i = 0; i < 20; i++)
{
char *a = g_strdup ("val1");
char *b = g_strdup ("val2");
add_inv (a, b);
g_free (a);
g_free (b);
}
g_hash_table_destroy (hashtable1);
g_hash_table_destroy (hashtable2);
return 0;
}
答案 0 :(得分:2)
设置G_SLICE环境变量以重新配置GSlice内存分配器。
G_SLICE=always-malloc ./your_application
以下是GLib documentation的相关部分。
这将导致通过g_slice_alloc()和分配的所有切片 由g_slice_free1()发布,通过直接调用实际分配 到g_malloc()和g_free()。这对内存检查器最有用 以及使用Bohem GC类似算法生成的类似程序 更准确的结果。它也可以与调试结合使用 系统的malloc实现的功能,如glibc的 MALLOC_CHECK_ = 2来调试错误的切片分配代码,尽管如此 debug-blocks通常是更适合的调试工具。