2015-01-08 13 views
5

BoehmガベージコレクタをLinuxでGLibと統合しようとしていますが、メモリを解放していないことが判明しています。g_strsplitを何度も呼び出すと、メモリが不足し、セグメンテーションエラーが発生します。ガベージコレクタ用のREADMEは、ダイナミックライブラリ内でポインタを見つけるのに問題があるかもしれないと警告し、GC_add_rootsを使用する必要があるかもしれません。glibでガベージコレクションを使用するとメモリリークが発生する

これをテストするために、GLibのすべての関連するコードをソースファイルにコピーしました。libglib-2.0.soとは全くリンクしていません。これによりセグメンテーションがなくなり、これは本当に問題であると私に伝えています。ただし、GC_add_rootsを使用してこれを解決する方法に関するドキュメントはありません。誰か助けてくれますか?ここで

は、メモリリークが発生コードです:GLibの2.46、g_mem_set_vtable() does nothingので

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

答えて

1

をするので、これは現代のGLibを使用してGLibのレベルで作業を取得する方法はありません。 g_malloc()g_new()などを呼び出すとき、GLibはlibcからのアロケータを無条件で使用します。g_slice_*()を明示的に使用しても、独自のGSLiceアロケータを使用しますが、ブロック割り当てもlibcアロケータから要求されます。

ガベージコレクタをlibcレベルで統合するようにしてください。 glibc’s malloc hooksを使用して実装することについては、an old articleがあります。これは、基本的にGMemVTableと同じですが、GLibレベルではなくglibcレベルです。私はこれを試していないので、それが実際にどれくらいうまく動作しているか分かりません。

関連する問題