2015-01-08 9 views
5

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; 
} 

risposta

1

Dal GLib 2.46, g_mem_set_vtable() does nothing, quindi non c'è alcun modo per ottenere questo lavoro a livello GLib utilizzando un GLib moderna. GLib ora usa incondizionatamente l'allocatore da libc quando chiami g_malloc(), g_new(), ecc. Usa ancora il proprio allocatore GSLice quando usi esplicitamente lo g_slice_*(), ma richiede anche l'allocazione dei blocchi dall'allocatore libc.

Ti suggerisco di provare a integrare il garbage collector al livello di libc. C'è an old article sull'implementazione di quello usando glibc’s malloc hooks, che sono essenzialmente uguali a GMemVTable, ma a livello di glibc invece che a livello di GLib. Non ho provato questo, quindi non so quanto bene funzioni nella pratica.

Problemi correlati