Ich versuche, den Boehm Garbage Collector mit GLib in Linux zu integrieren, aber in einem Fall habe ich festgestellt, dass es den Speicher nicht freigibt: wenn ich g_strsplit viele Male aufrufen, wird es keinen Speicher mehr haben und segfault. Das README für den Garbage Collector warnte, dass es möglicherweise Probleme gibt, Zeiger in dynamischen Bibliotheken zu finden, und die Verwendung von GC_add_roots erfordern kann.Speicherverlust bei der Verwendung von Garbage Collection mit Glib
Um dies zu testen, habe ich den gesamten relevanten Code von GLib in meine Quelldatei kopiert, ohne überhaupt mit libglib-2.0.so zu verlinken. Dies beseitigt die segfaults, was mir sagt, dass dies in der Tat das Problem ist. Es gibt jedoch keine Dokumentation zur Verwendung von GC_add_roots, um dies zu beheben. Kann mir jemand helfen?
Hier ist der Code, der den Speicherverlust verursacht:
#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;
}