4

メモリ プール が原因(g_slice)possibly lost、コードに入ります。私の質問は、リークを避けるためにコードでできることはありますか、それとも純粋に GLib の問題ですか?

これらはすべて「失われた可能性がある」と報告されています。

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

1 に答える 1

2

G_SLICE 環境変数を設定して、GSlice メモリ アロケータを再構成します。

G_SLICE=always-malloc ./your_application

これは、 GLib ドキュメントの関連部分です。

これにより、g_slice_alloc() によって割り当てられ、g_slice_free1() によって解放されたすべてのスライスが、g_malloc() および g_free() への直接呼び出しによって実際に割り当てられます。これは、Bohem GC のようなアルゴリズムを使用してより正確な結果を生成するメモリ チェッカーや同様のプログラムに最も役立ちます。また、システムの malloc 実装のデバッグ機能 (glibc の MALLOC_CHECK_=2 など) と組み合わせて、誤ったスライス割り当てコードをデバッグすることもできますが、通常は debug-blocks の方が適切なデバッグ ツールです。

于 2012-05-12T07:45:40.627 に答える