[英]Memory leak when using garbage collection with glib
我正在尝试将Boehm垃圾收集器与GLib集成在Linux中,但在一种情况下,我发现它并没有释放内存:当我多次调用g_strsplit时,它会耗尽内存和段错误。 垃圾收集器的README警告它可能无法在动态库中查找指针,并且可能需要使用GC_add_roots。
为了测试这一点,我将GLib中的所有相关代码复制到我的源文件中,而不是根据libglib-2.0.so进行链接。 这消除了段错误,这告诉我这确实是问题所在。 但是,没有关于如何使用GC_add_roots来解决此问题的文档。 有人能帮我吗?
以下是导致内存泄漏的代码:
#include <glib.h>
#include <gc.h>
void no_free(void *mem) {}
int main() {
g_mem_gc_friendly = TRUE;
GMemVTable memvtable = {
.malloc = GC_malloc,
.realloc = GC_realloc,
.free = no_free,
.calloc = NULL,
.try_malloc = NULL,
.try_realloc = NULL
};
g_mem_set_vtable(&memvtable);
for (int i = 0; i < 10000; i++) {
char **argv = g_strsplit("blah", " ", 0);
argv[0][0] = 'a'; // avoid unused variable warning
}
return 0;
}
由于GLib 2.46, g_mem_set_vtable()
什么都不做 ,所以没有办法使用现代GLib在GLib级别上工作。 当你调用g_malloc()
, g_new()
等时,GLib现在无条件地使用来自libc的allocator。当你明确地使用g_slice_*()
,它仍然使用它自己的GSLice
分配器,但是它也从libc分配器请求它的块分配。
我建议你尝试将垃圾收集器集成到libc级别。 有一篇关于使用glibc的malloc钩子实现它的旧文章 ,它与GMemVTable
基本相同,但是在glibc级别而不是GLib级别。 我没试过这个,所以我不知道它在实践中有多好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.