Sto cercando di integrare il garbage collector Boehm con GLib in Linux, ma in un caso ho scoperto che non sta liberando la memoria: quando chiamo g_strsplit molte volte, lo farò esaurito la memoria e segfault. Il README per il garbage collector ha avvertito che potrebbe avere problemi nel trovare i puntatori all'interno delle librerie dinamiche e potrebbe richiedere l'uso di GC_add_roots.Perdita di memoria quando si usa la garbage collection con glib
Per verificarlo, ho copiato tutto il codice pertinente da GLib nel mio file sorgente, non collegandolo affatto a libglib-2.0.so. Questo ha eliminato i segfaults, il che mi dice che questo è davvero il problema. Tuttavia, non esiste alcuna documentazione su come utilizzare GC_add_roots per risolvere questo problema. Qualcuno può aiutarmi?
Ecco il codice che causa la perdita di memoria:
#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;
}