Je développe une bibliothèque en utilisant un certain nombre de structures de données glib (GHashTable, GSList, etc.). J'ai vérifié mon code fréquemment pour des fuites de mémoire en utilisant valgrind. La plupart des problèmes soulignés par Valgrind sont assez faciles à résoudre, mais il y en a quelques-uns que je n'arrive pas à comprendre.Valgrind signale une perte de mémoire lors de l'utilisation de types de données glib
Tous ces éléments sont signalés comme «éventuellement perdus».
Au sommet du stacktrace valgrind, je trouve toujours les mêmes 4 bibliothèques:
==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)
Plus bas dans la pile d'appel, il y a toujours un appel à une fonction bien pendue, comme g_key_file_new(), g_slist_prepend(), g_strsplit(), g_key_file_load_from_file(), g_file_get_contents().
Mes questions sont les suivantes:
Quelqu'un at-il rencontré ce et a trouvé un moyen de contourner cela?
Ou est-ce quelque chose que je peux ignorer? Est-ce dû au glib utilisant des pools de mémoire, comme suggéré here?
J'utilise
- valgrind-3.5.0
- glib-2.12.3
- gcc (GCC) 4.1.2 20.080.704 (Red Hat 4.1.2-48)
- CentOS version 5.5 (final)
Exécuter le programme avec G_SLICE = always-malloc ne montre aucune mémoire perdue, qui confirme ma suspicion que toute perte de mémoire (possible) se produit à cause des pools de mémoire. Merci Havoc P pour la réponse claire. – ttreitlinger
Havoc pouvez-vous confirmer que votre déclaration sur les variables globales est toujours vrai pour GLib 2.32? Merci! –
oui, par exemple dans gconvert.c "static GHashTable * iconv_cache" etc. (juste un exemple) –