В некоторых программах часть выделенной памяти вообще не уничтожается, но они требуются для всего времени работы программы. Следовательно, в целом считается безопасным.Как проверить фактические утечки памяти во время выполнения с помощью Valgrind?
Но есть и другие объекты, которые не предназначены для всего времени работы программы, но не уничтожены из-за промахов разработчиков. Это фактические утечки памяти, которые необходимо устранить.
Когда мы запускаем следующую команду Valgrind, она отображает только полные утечки после завершения выполнения программы. Следовательно, может кто-то прояснить, как отличить выше двух сценариев от выхода проверки утечки Valgrind.
Команда, которую я использовал для обнаружения утечек памяти;
valgrind --log-file=valgrind_output.txt --tool=memcheck --leak-check=yes ./MyTestProgram
Типичный выход в конце исполнения;
==10108== LEAK SUMMARY:
==10108== definitely lost: 392,323 bytes in 1,164 blocks
==10108== indirectly lost: 178,120 bytes in 4,283 blocks
==10108== possibly lost: 170,155,118 bytes in 3,347,087 blocks
==10108== still reachable: 263,778,326 bytes in 3,935,669 blocks
Есть ли возможность в Valgrind, как Tap в IBM Purify инструмент, который может обнаружить в настоящее время утечка памяти во время выполнения?
Для целей отладки и поиска утечки может оказаться полезным освободить глобальные переменные до их завершения, даже если это технически бесполезно. Действительно, вы все еще хотите знать, являются ли эти переменные косвенной утечкой памяти (например, если у вас есть глобальный экземпляр класса, который инкапсулирует класс, который теряет память). –
выглядит как копия этого: http://stackoverflow.com/q/7945885/476681 –
Позднее наблюдение за вышеприведенным комментарием ... рассмотрим объект с нетривиальным деструктором, который делает больше, чем просто освобождение памяти. Закрытие сокетов, отправка в базу данных, что-то в этом роде. Если вы просто оставите такой объект болтающимся (например, назначив его через 'new', а затем никогда не называя' delete' на нем), * этот деструктор никогда не будет называться *, даже хотя ОС будет очищать пространство памяти после завершения процесса. Вот почему те, кто страдает от утери, должны быть восприняты всерьез. – DevSolar