Comments 17
Сам пользуюсь valgrind т.к. не используется msvs. Имхо будет похоже на vld только код трогать не надо.
Можно ещё попробовать Address Sanitizer (https://clang.llvm.org/docs/AddressSanitizer.html). Работает и в clang и в gcc. Вроде бы есть и в visual studio экспериментальная поддержка (https://devblogs.microsoft.com/cppblog/asan-for-windows-x64-and-debug-build-support/). Плюс в том, что ловит не только утечки памяти, но и прочие ошибки работы с ней, например использование освобождённой памяти или выход за границы буфера.
Не хватает обзора стандартного средства поиска утечек памяти из Visual Studio
https://docs.microsoft.com/ru-ru/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2019
Неплохо бы осветить еще один аспект — можно ли искать утечки, если часть программы представлена в виде собранной библиотеки, а не исходного кода.
P.S. И так уж получилось, что вчера я тоже опубликовал статью, касающуюся Qt 6. Статья хорошо показывает, что хоть с утечками и не очень, зато других ошибок можно найти на любой вкус и цвет. :) Приглашаю читателей: Обработка дат притягивает ошибки или 77 дефектов в Qt 6.
Вас интересуют примеры утечек или примеры того, что обнаружил продукт PVS-Studio?
Основная причина того, что PVS-Studio не смог найти утечки в Qt-приложении, кроется в самом Qt и в его иерархиях наследования. Дело в том, что все базовые классы Qt (QObject, QWidget) уже содержат виртуальный деструктор, и потому ошибка программиста здесь исключена. Как я понимаю, именно отлов деструктора, не являющегося виртуальным, для базовых классов, является самом ключевым элементом в PVS-Studio для поиска утечек. И вот как раз он объективно не мог сработать.
Да, я и сам отмечал в статье, что статические анализаторы явно проигрывают динамическим в поиске утечек памяти.
Расскажите это расту.
Есть еще Deleaker, у него из особенностей — возможность делать такие же снимки для GDI объеков.
int* array = nullptr;
for (int i = 0; i < 5; i++)
{
array = new int[10];
}
delete[] array;
эквивалентно
int* array =new int[10];
int* array =new int[10];
int* array =new int[10];
int* array =new int[10];
int* array =new int[10];
и каждый раз будет выделена разная память? И компилятор на такое не ругается?
И можно даже так?
int* a =new int;
int* a =new int;
int* a =new int;
int* a =new int;
int* a =new int;
И валидный будет только последний адрес?
О поиске утечек памяти в С++/Qt приложениях