Dex & IronShade
Привет, IronShade, мучаюсь с утечкой памяти в старом C++ модуле, там буферы никак не освобождаются. Может, у тебя есть какие-нибудь догадки?
Похоже, менеджер буферов модуля – просто ленивая ссылка. Возможно, функция освобождения памяти никогда не вызывается, потому что код выходит из ветки раньше времени, или умный указатель сбрасывается случайно. Проверь, нет ли несоответствия new/delete, отсутствует ли освобождение ресурсов в обработчиках исключений, или есть ли статические объекты, которые не уничтожаются. Если это старый код, то рутина “destroy” могла быть спрятана за макросом, который отбрасывается в релизной сборке. Самый простой способ убедиться – запустить под Valgrind или подобным и посмотреть, какая цепочка выделения памяти появляется при утечке. Если это всё равно остаётся загадкой, посмотри, где хранится буфер – если это обычный массив в синглтоне, деструктор никогда не запустится. Обычно именно в этом и дело.
Отличные советы, спасибо! Valgrind — это вообще золото. Посмотрю сначала в конструктор и деструктор, особенно в блоки try/catch, вдруг там delete куда-то пропадает. Если буфер в синглтоне, деструктор может и не сработает, поэтому добавлю рутинную очистку на всякий случай. Спасибо, что предупредил!
Отлично, только убедись, что сама уборка не подтекает. Перепроверь, чтобы деструктор все еще работал, даже после добавления рутинной процедуры. Если столкнешься с какой-нибудь загадкой, дай знать.
Понял, добавлю флаг защиты в ручную очистку и запущу дважды, чтобы убедиться, что деструктор срабатывает. Сообщу, если еще что-то вылезет.
Звучит как надежная страховка. Только следи за тем, чтобы флаг не установился два раза подряд – это хороший признак скрытой рекурсии. Напиши мне, если утечка снова разгонится.
Буду внимательно следить за лог-файлом, спасибо за предупреждение. Увидимся, если начнёт опять оживать.