Приходилось ли работать с утечками памяти и какими инструментами пользовались
Что проверяют
Знаете ли вы, чем ищут утечки, и понимаете ли, что в современном C++ утечка это в первую очередь дефект владения, а не забытый delete в одной ветке.
Как отвечать
Сначала инструменты, по ситуациям:
- Санитайзеры. Сборка с
-fsanitize=addressдаёт детектор утечек и заодно ловит выход за границы и обращение к освобождённой памяти. Быстро, но требует пересборки и поддерживается не везде. - Valgrind, режим memcheck. Пересборка не нужна, ловит ещё и чтение неинициализированной памяти, но замедляет программу в десятки раз, поэтому годится для тестов, а не под нагрузкой.
- Профайлеры кучи. Показывают рост потребления по стекам выделений и находят то, что формально не утечка: неограниченный кэш, контейнер, который никто не чистит.
- Windows. Отладочная куча CRT и встроенные средства анализа памяти в среде разработки.
Затем про профилактику, это и есть содержательная часть ответа: RAII, владение через unique_ptr, разделяемое владение только там, где оно действительно разделяемое, weak_ptr для разрыва циклов, правило нуля, контейнеры вместо ручных массивов. При таком коде парные new и delete из программы почти исчезают, а исключение в середине функции перестаёт быть источником утечки.
Добавьте, что память не единственный ресурс: дескрипторы, сокеты и блокировки текут точно так же и лечатся тем же RAII.
Где спотыкаются
Отвечают «нашёл место и расставил delete». Для интервьюера это сигнал, что кандидат пишет на C с классами: ожидаемый ответ про владение, а не про парные вызовы.
Не разбирают категории отчёта. Потерянная память, косвенно потерянная, возможно потерянная и всё ещё достижимая это разные вещи. Гоняться за достижимыми блоками синглтона бессмысленно, а шум сторонней библиотеки гасится файлом подавлений, а не отказом от инструмента.
Считают чистый отчёт доказательством отсутствия утечек. Инструмент видит только то, что выполнилось в конкретном прогоне, и редкая ветка с ранним возвратом останется непроверенной. А циклическая ссылка через shared_ptr утекает вообще без единого голого указателя в коде.