避免GLib内存池和Valgrind可能输给了C

时间:2012-05-12 03:46:25

标签: c memory-leaks valgrind glib

由于memory pools (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;
}

1 个答案:

答案 0 :(得分:2)

设置G_SLICE环境变量以重新配置GSlice内存分配器。

G_SLICE=always-malloc ./your_application

以下是GLib documentation的相关部分。

  

这将导致通过g_slice_alloc()和分配的所有切片   由g_slice_free1()发布,通过直接调用实际分配   到g_malloc()和g_free()。这对内存检查器最有用   以及使用Bohem GC类似算法生成的类似程序   更准确的结果。它也可以与调试结合使用   系统的malloc实现的功能,如glibc的   MALLOC_CHECK_ = 2来调试错误的切片分配代码,尽管如此   debug-blocks通常是更适合的调试工具。