我试图在Linux中将Boehm垃圾收集器与GLib集成在一起,但是在一种情况下,我发现它没有释放内存:当我多次调用g_strsplit时,它将耗尽内存并出现段错误。垃圾收集器的自述文件警告说,它可能无法在动态库中找到指针,并且可能需要使用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.46g_mem_set_vtable()
不执行任何操作,因此无法使用现代GLib在GLib级别上使此工作正常进行。GLib现在在调用g_malloc()
,g_new()
等时无条件地使用libc中的GSLice
分配器。当您显式使用时g_slice_*()
,GLib仍使用自己的分配器,但是它也向libc分配器请求其块分配。
我建议您尝试在libc级别集成垃圾收集器。有一篇关于使用glibc的malloc钩子实现该方法的老文章,该钩子与基本上相同GMemVTable
,但是在glibc级别而不是GLib级别。我没有尝试过,所以我不知道它在实践中的效果如何。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句