我正在尝试在 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;
}