Valgrind сообщает, что память "возможно потеряна" при использовании типов данных glib
Я разрабатываю библиотеку, используя ряд структур данных glib (GHashTable, GSList и т. д.). Я часто проверял свой код на наличие утечек памяти с помощью valgrind. Большинство проблем, на которые указывает valgrind, довольно легко исправить, однако есть несколько, которые я не могу понять.
все они сообщаются как "возможно потерянные".
в верхней части valgrind 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
- Глеб-2.12.3
- gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
- CentOS release 5.5 (Final)
2 ответов
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 должен показать эти глобальные распределения как достижимые, а не как потерянные.
glib-2.12 довольно старый.
попробуйте получить glib-2.24, скомпилировать и установить его (с --prefix= / usr / local / glib-2.24 например), затем используйте его для компиляции приложения.
Если у вас все еще есть это, попробуйте прочитать руководство glib еще раз:)