使用glib进行垃圾收集时内存泄漏

时间:2015-01-08 06:33:09

标签: c memory-leaks garbage-collection glib boehm-gc

我试图在Linux中将Boehm垃圾收集器与GLib集成,但在一个案例中我发现它没有释放内存:当我多次调用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;
}

1 个答案:

答案 0 :(得分:1)

由于GLib 2.46,g_mem_set_vtable() does nothing,因此无法使用现代GLib在GLib级别上工作。当您调用g_malloc()g_new()等时,GLib现在无条件地使用来自libc的分配器。当您明确使用GSLice时,它仍然使用自己的g_slice_*()分配器,但是请求来自libc分配器的块分配。

我建议您尝试将垃圾收集器集成到libc级别。 an old article使用glibc’s malloc hooks来实现它,Live On Coliru基本上与GMemVTable相同,但是在glibc级别而不是GLib级别。我没试过这个,所以我不知道它在实践中的效果如何。