使用 glib 进行垃圾回收时内存泄漏
Memory leak when using garbage collection with glib
我正在尝试在 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.46 开始,g_mem_set_vtable()
does nothing,因此无法使用现代 GLib 在 GLib 级别实现此功能。当您调用 g_malloc()
、g_new()
等时,GLib 现在无条件地使用来自 libc 的分配器。当您显式使用 g_slice_*()
时,它仍然使用它自己的 GSLice
分配器,但是请求它的块分配也来自 libc 分配器。
我建议您改为尝试在 libc 级别集成垃圾收集器。有 an old article about implementing that using glibc’s malloc hooks,它与 GMemVTable
本质上相同,但在 glibc 级别而不是 GLib 级别。这个我没试过,不知道实际效果如何。
我正在尝试在 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.46 开始,g_mem_set_vtable()
does nothing,因此无法使用现代 GLib 在 GLib 级别实现此功能。当您调用 g_malloc()
、g_new()
等时,GLib 现在无条件地使用来自 libc 的分配器。当您显式使用 g_slice_*()
时,它仍然使用它自己的 GSLice
分配器,但是请求它的块分配也来自 libc 分配器。
我建议您改为尝试在 libc 级别集成垃圾收集器。有 an old article about implementing that using glibc’s malloc hooks,它与 GMemVTable
本质上相同,但在 glibc 级别而不是 GLib 级别。这个我没试过,不知道实际效果如何。