Comments 12
Есть альтернативы valgrind’у, такие как strace
это не альтернатива, это просто другой инструмент
А в целом по утечкам есть еще один неприятный момент. Некоторые программисты считают, что память для одиночных объектов, тех которые порождаются один раз в начале программы нет необходимости принудительно освобождать. Мол программа завершается и все, память будет сама собой освобождена. И вроде бы они правы.
Но когда смотришь на десятки-сотни неосвобожденных объектов и думаешь, а какие же из них это реальные утечки?
Причем ладно бы это был код написанный тобой и другими программистами команды. Но ведь подключаешь кучу сторонних библиотек со своим АПИ. Что там внутри происходит не до конца понятно. Вот вызвал простую init() а она выделила десять блоков и нет АПИ функции освободить.
Еще хуже, когда выделяется память ядра при вызове специфичного ioctl. Как потом найти утечку непонятно.
При моей не любви к MacOS и XCode, там профилировщики ооочень удобные.
Никто, случайно, не знает аналог профилировщика аллокаций XCode под Windows?
V519 The 'students' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 82, 87. test.cpp 87
Во втором случае он явно скажет:
V773 The function was exited without releasing the 'mas' pointer. A memory leak is possible. test.cpp 29
Но для этого придётся изменить название функции main :). В функции main подобные утечки памяти сознательно не ищутся, так как это распространённая практика, завершить работу, не утруждая себя очисткой памяти в простых программа. Кто не понимает зачем, того отправляю к статье "Почему я не люблю синтетические тесты" :).
Конечно, статические анализаторы слабее динамических в плане выявления утечек памяти. Однако, они могут стать хорошей первой линией оборины. Подробнее эта тема раскрыта здесь "Да, PVS-Studio умеет выявлять утечки памяти".
И последнее. Не забывайте, что PVS-Studio можно использовать бесплатно в образовательных целях: "Преподавателям на заметку: PVS-Studio для знакомства студентов с инструментами анализа кода".
Хорошая статья, узнал несколько полезных возможностей по теме. Но нашел проблему - если выделять память в линуксе не через С, а через mmap.
Valgrind говорит все хорошо, от этого вопрос: а будет ли статья по его устройству, причем не в пользовательском стиле (типа "делает магию, используя магию"), а в реальном его устройстве? Раскрытия такой темы пока не нашел.
malloc в linux при запросе достаточно большого объема памяти (128 КБ по дефолту) как раз использует mmap. При этом используется анонимное отбражение памяти из адресного пространства самого процесса. Такая выделенная память при завершении процесса умрет вместе с ним. Описано в т.ч. тут: https://habr.com/ru/company/smart_soft/blog/185226/
Ловим утечки памяти в С/С++