2012-05-12 7 views
4

memory pools(g_slice)のため、私はpossibly lostを私のコードに入れます。私の質問は、漏れを防ぐために私のコードでできることは何か、それとも純粋にGLibの問題ですか?GLibメモリプールを避け、ValgrindがCで失われている可能性があります

これらはすべて「おそらく失われた」と報告されています。 GSliceメモリアロケータを再構成する

==2552== 
==2552== 744 bytes in 3 blocks are possibly lost in loss record 6 of 8 
==2552== at 0x40235BE: memalign (vg_replace_malloc.c:694) 
==2552== by 0x402361B: posix_memalign (vg_replace_malloc.c:835) 
==2552== by 0x408693E: ??? (in /usr/lib/libglib-2.0.so.0.1600.6) 
==2552== by 0x4088112: g_slice_alloc (in /usr/lib/libglib-2.0.so.0.1600.6) 
==2552== by 0x405B503: ??? (in /usr/lib/libglib-2.0.so.0.1600.6) 
==2552== by 0x804876C: add_inv (in /home/user/a.out) 
==2552== by 0x8048818: main (in /home/user/a.out) 

#include <glib.h> 
static GHashTable *hashtable1; 
static GHashTable *hashtable2; 

int add_inv (char *a, char *b) { 
    GHashTable *table = NULL; 
    gpointer old_value; 
    char *mykey = NULL; 
    int i, plus, *pointer; 

    for (i = 0; i < 2; i++) 
    { 
     if (i == 0) 
     { 
      table = hashtable1; 
      mykey = a; 
     } 
     else if (i == 1) 
     { 
      table = hashtable2; 
      mykey = b; 
     } 
     old_value = g_hash_table_lookup (table, mykey); 
     if (old_value != NULL) 
     { 
      pointer = (int *) old_value; 
      plus = *pointer + 10; 
     } 
     else 
     plus = 10; 

     pointer = g_malloc (sizeof (int)); 
     *pointer = plus; 
     g_hash_table_replace (table, g_strdup (mykey), pointer); 
    } 
} 

int main() { 
    int i; 
    hashtable1 = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, g_free); 
    hashtable2 = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) g_free, g_free); 

    for (i = 0; i < 20; i++) 
    { 
     char *a = g_strdup ("val1"); 
     char *b = g_strdup ("val2"); 
     add_inv (a, b); 
     g_free (a); 
     g_free (b); 
    } 
    g_hash_table_destroy (hashtable1); 
    g_hash_table_destroy (hashtable2); 
    return 0; 
} 

答えて

2

設定G_SLICE環境変数。

G_SLICE=always-malloc ./your_application 

ここにはGLib documentationの関連部分があります。

これは)実際には、直接g_mallocへの呼び出し ()とg_free(経由で割り当てられる)(g_slice_free1でリリースされたすべてのg_slice_allocによって割り当てられたスライス()と の原因となります。これはメモリチェッカー などのBohem GC類似アルゴリズムを使用して より正確な結果を生成する類似のプログラムに最も便利です。また、 のglockcの MALLOC_CHECK_ = 2などのシステムのmalloc実装の機能をデバッグと組み合わせて、誤ったスライス割り当てコードをデバッグすることもできます。 デバッグブロックは通常、より適したデバッグツールです。

+0

私は、プログラムを実行するときだけでなく、自分のコード内で何らかの形で取り除くことができるかどうかを知りたいと思っています。 – user43092

関連する問題