Чтобы выяснить, какие биты вашего кода вызывают утечку (если таковые имеются), скомпилируйте ваш код, включив в него символы отладки (т. Е. Включите флаг -g
, если вы используете gcc
), затем запустите вашу программу через Valgrind .
valgrind --leak-check=full ./your_program
Выполнение займет немного больше времени, чем обычно, но когда ваша программа завершится, вывод valgrind должен сообщить вам, сколько памяти вы вытекли и где находятся culrit.
Пример вывода:
==10934== HEAP SUMMARY:
==10934== in use at exit: 10 bytes in 10 blocks
==10934== total heap usage: 10 allocs, 0 frees, 10 bytes allocated
==10934==
==10934== 10 bytes in 10 blocks are definitely lost in loss record 1 of 1
==10934== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==10934== by 0x8048402: main (a.c:8)
==10934==
==10934== LEAK SUMMARY:
==10934== definitely lost: 10 bytes in 10 blocks
==10934== indirectly lost: 0 bytes in 0 blocks
==10934== possibly lost: 0 bytes in 0 blocks
==10934== still reachable: 0 bytes in 0 blocks
==10934== suppressed: 0 bytes in 0 blocks
обновление
Поскольку вы уже используете valgrind, возможно, вы можете попробовать использовать инструмент Massif, который поставляется с ним. Он должен быть в состоянии нарисовать более точную картину использования памяти (по сравнению с простым просмотром сверху).
Ознакомьтесь с этим руководством , чтобы узнать, как его можно использовать. Вам могут понадобиться некоторые дополнительные опции, чтобы получить разумный график в зависимости от времени выполнения и использования памяти вашей программой. Некоторые полезные опции описаны несколькими страницами позже в руководстве.
Удачи.