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

mar*_*llm 5 c garbage-collection memory-leaks glib boehm-gc

我正在尝试将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;
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*all 1

由于 GLib 2.46g_mem_set_vtable()不执行任何操作,因此无法使用现代 GLib 在 GLib 级别上使其工作。g_malloc()现在,当您调用、等时,GLib 无条件使用 libc 中的分配器g_new()。当您显式使用 时,它仍然使用自己的GSLice分配器g_slice_*(),但这也从 libc 分配器请求其块分配。

\n\n

我建议您尝试在 libc 级别集成垃圾收集器。有\xe2\x80\x99s一篇关于使用glibc\xe2\x80\x99s malloc hooks实现的旧文章,它本质上与 相同,但在 glibc 级别而不是 GLib 级别。我还没有尝试过这个,所以我不知道它在实践中效果如何。GMemVTable

\n