вы не указали, какую платформу вы ищете. Я разработчик Windows, поэтому я могу рекомендовать только Windows решения. Если это то, с чем вы работаете, есть ряд коммерческих и бесплатных инструментов. Немногие, с которыми я лично работал: Purify, BoundsChecker, UMDH, LeakDiag, DebugDiag.
Из них я обычно предпочитаю UMDH. Он бесплатный и входит в состав Средства отладки для Windows (DTW) . Я обнаружил, что он на самом деле более надежный и менее ресурсоемкий, чем большинство других, включая профессиональные инструменты. Его очень просто использовать, а документацию можно найти в файле .chm, который поставляется с установкой DTW. В конце концов, я лично обнаружил, что UMDH имеет очень высокое отношение сигнал / шум по сравнению со многими другими инструментами.
DebugDiag - еще одна хорошая альтернатива. Насколько я могу судить, он использует почти те же API, что и UMDH, но его использование несколько сложнее, поскольку оно основано на интерфейсе пользователя, а не на командной строке, поэтому для достижения цели обычно требуется больше кликов, но для кого-то нового я бы рекомендовал его UMDH.
UPDATE:
Интересно, что большинство предпочитало вставлять пользовательские хуки в malloc / free, а затем добавлять еще больше кода для пользовательских хуков в операторы new / delete.
Я настоятельно рекомендую вам взглянуть на UMDH и узнать, как он работает, даже если вы не находите в этом особого необходимости. В основе всех распределений памяти лежат функции Windows, HeapAlloc / HeapFree. Microsoft, ожидая необходимости в методах обнаружения утечек, уже предоставила хуки, которые мы можем использовать на этом корневом уровне.
Это другие преимущества использования UMDH по сравнению с пользовательскими перехватчиками:
- Вы получаете полную трассировку стека каждого распределения, а не только то, что предоставляется __FILE__ и __LINE __
- Он уже имеет полную отчетность и агрегирование статистики, которую вы должны написать поверх простого перехвата malloc / free. Вы получаете количество распределений для каждой трассы, количество байтов, выделенных каждой трассой, и список выделенных буферов памяти, так что вы можете фактически проанализировать, какие типы данных были пропущены.
- Обнаружение утечек malloc / free, которые произошли в чужом коде, а не в конкретно DLL под вашим контролем
- Обнаружение утечек из других функций выделения памяти, таких как CoTaskMemAlloc или SysStringAlloc
- Обнаружение утечек COM-объектов, которые не были должным образом устранены
- Обнаружение логических ошибок в вашем коде при вызове стороннего API, который возвращает буфер, который вы забыли освободить.
- Вы можете использовать UMDH мгновенно с любой кодовой базой, не добавляя пользовательский код снова и снова.
- Принятый вами метод работает только в среде отладки. UMDH может использоваться точно так же, без каких-либо изменений кода в производственных системах.
Практически каждый раз, когда наблюдается тенденция к увеличению использования памяти, инструмент сообщит вам, откуда он. Большую часть времени я могу обнаружить утечку в течение 10 минут, если ее можно воспроизвести на компьютере разработчика (при отладке рабочего кода это занимает немного больше времени, поскольку файлы символов должны соответствовать, иногда вручную).
Итак, если вы получаете все это совершенно бесплатно с установками DTW (у которых, кстати, есть и другие потрясающие функции отладки), почему люди предпочитают создавать свой собственный код обнаружения утечек?