我正在使用许多glib数据结构(GHashTable,GSList等)开发库。我一直在使用valgrind经常检查我的代码是否有内存泄漏。 valgrind指出的大多数问题很容易解决,但有一些我无法弄清楚。
所有这些都被报告为“可能丢失”。
在valgrind stacktrace的顶部,我总能找到相同的4个库:
==29997== 1,512 bytes in 3 blocks are possibly lost in loss record 24 of 25
==29997== at 0x4004B11: memalign (vg_replace_malloc.c:532)
==29997== by 0x4004B6B: posix_memalign (vg_replace_malloc.c:660)
==29997== by 0x5E9AC4: ??? (in /lib/libglib-2.0.so.0.1200.3)
==29997== by 0x5EA4FE: g_slice_alloc (in /lib/libglib-2.0.so.0.1200.3)
在调用堆栈中,总是调用glib函数,例如g_key_file_new(),g_slist_prepend(),g_strsplit(),g_key_file_load_from_file(),g_file_get_contents()。
我的问题是:
有没有人遇到这个并找到了解决办法?
或者这是我可以忽视的事情吗?是否由于glib使用内存池,如建议here?
我正在使用
答案 0 :(得分:34)
GLib有一些让Valgrind感到困惑的功能。
一个是内存池(较新的glib中的g_slice,较旧的“mem chunks”)。这些是用于小对象(如列表节点)的专用分配器。您可以使用它来禁用切片分配器:
G_SLICE=always-malloc valgrind myprogram
第二个问题是有时候GLib会避免初始化新内存或者在释放的切片/块中保留死指针。你可以解决这个问题:
G_DEBUG=gc-friendly valgrind myprogram
当然这样:
G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind myprogram
第三个问题是GLib具有全局变量,这些变量根本不会被释放,但被认为是永久性程序状态。例如,注册的GType永远不会被卸载,还有一些其他的。这是不可修复的,但是valgrind应该将这些全局分配显示为可达,而不是丢失。
答案 1 :(得分:0)
glib-2.12已经很老了。
尝试获取glib-2.24,编译并安装它(例如 --prefix = / usr / local / glib-2.24 )然后用它来编译你的应用程序。
如果还有,请尝试再次阅读glib手册:)