Подтвердить что ты не робот

Valgrind сообщает, что память "возможно потеряна" при использовании типов данных glib

Я разрабатываю библиотеку, используя ряд glib-данных (GHashTable, GSList и т.д.). Я часто проверяю свой код на утечки памяти, используя valgrind. Большинство вопросов, о которых указывает valgrind, довольно легко исправить, однако есть несколько, которые я не могу понять.

Все они сообщаются как "возможно потерянные".

В верхней части valtind stacktrace я всегда нахожу те же 4 библиотеки:

==29997== 1,512 bytes in 3 blocks are possibly lost in loss record 24 of 25
==29997==    at 0x4004B11: memalign (vg_replace_malloc.c:532)
==29997==    by 0x4004B6B: posix_memalign (vg_replace_malloc.c:660)
==29997==    by 0x5E9AC4: ??? (in /lib/libglib-2.0.so.0.1200.3)
==29997==    by 0x5EA4FE: g_slice_alloc (in /lib/libglib-2.0.so.0.1200.3)

Далее в стеке вызовов всегда есть вызов функции glib, такой как g_key_file_new(), g_slist_prepend(), g_strsplit(), g_key_file_load_from_file(), g_file_get_contents().

Мои вопросы:

  • Кто-нибудь сталкивался с этим и нашел способ обойти его?

  • Или это то, что я могу игнорировать? Это связано с glib с использованием пулов памяти, как предложено здесь?

Я использую

  • valgrind-3.5.0
  • glib-2.12.3
  • gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
  • Версия CentOS 5.5 (Final)
4b9b3361

Ответ 1

В GLib есть несколько функций, которые путают Valgrind.

Один из них - пулы памяти (g_slice в новом glib, "mem chunks" старше). Это специализированные распределители, используемые для небольших объектов, таких как узлы списка. Вы можете использовать это, чтобы отключить распределитель среза: G_SLICE=always-malloc valgrind myprogram

Вторая проблема заключается в том, что иногда GLib избегает инициализации новой памяти или сохранения мертвых указателей в освобожденных срезах/кусках. Вы можете исправить это с помощью: G_DEBUG=gc-friendly valgrind myprogram

Итак, вместе, конечно: G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind myprogram

Третья проблема заключается в том, что GLib имеет глобальные переменные, которые просто никогда не освобождаются, а рассматриваются как состояние постоянной программы. Например, зарегистрированные GType никогда не выгружаются, а некоторые другие. Это не фиксируется, но valgrind должен показывать эти глобальные распределения как достижимые, а не как потерянные.

Ответ 2

glib-2.12 довольно старый.

Попробуйте получить glib-2.24, скомпилируйте и установите его (например, с помощью --prefix=/usr/local/glib-2.24), затем используйте его для компиляции вашего приложения.

Если у вас все еще есть это, попробуйте снова прочитать руководство glib:)