Насколько важно устранить утечки памяти?


19

Я обнаружил, Valgring, что некоторые программы GTK + утечки памяти. Насколько важно устранить эти утечки? Я имею в виду, что часто эти программы работают очень хорошо, но, с другой стороны, никогда нельзя быть уверенным, если кто-то захочет скопировать часть кода утечки в какую-то другую программу. И я не уверен, что идея GTK + -программ состоит в том, чтобы работать быстро и, следовательно, есть утечки.

Поэтому, если я иногда обнаруживаю утечку памяти в программе с открытым исходным кодом, я должен ее исправить или есть, например, проблемы с эффективностью, и, следовательно, первоначальная идея программистов заключалась в том, чтобы написать небольшой небольшой утечка кода?


17
Утечки памяти всегда нежелательны. Они представляют ресурсы, которые не может использовать вся система, включая хост-программу, до тех пор, пока она не завершится.
recursion.ninja

Существует достаточно инструментов / библиотек, которые занимаются отслеживанием утечек памяти. Это стоит усилий, так как использование API на вашей стороне может быть неправильным.
Joop Eggen

1
Как примечание: Вальгринд великолепен, но может сообщать о некоторых ложных срабатываниях (я видел их в GObject).
Мацей Пехотка

Вычисления зависят от обработки и от памяти: первый - это код, а второй - пространство, в котором он выполняется. Если вам нельзя доверять, чтобы не испачкать свою собственную комнату, как вы можете ожидать, что он будет использоваться для чего-то полезного?
Ималлетт

1
«Всегда пишите код, как будто человек, который в конечном итоге поддерживает ваш код, является жестоким психопатом, который знает, где вы живете».
Джесси С. Slicer

Ответы:


6

Насколько важно устранить утечки памяти, зависит от серьезности проблемы и того, что еще нужно сделать, что важно. Мой опыт показывает, что небольшие утечки памяти имеют тенденцию быть довольно мягкими для большинства приложений. Время жизни сеанса настольного приложения, как правило, не достаточно велико, чтобы увидеть какое-либо ухудшение из-за небольшой утечки памяти.

Если вы пишете сервер, работающий 24 часа в сутки, небольшие утечки памяти могут со временем накапливаться и стать серьезной проблемой. Но именно поэтому многие компании планируют перезапуск своих серверов ежедневно или еженедельно. Усилия по поиску утечек памяти часто являются чрезмерными по сравнению с тем, что может быть получено, поэтому легче перезапускать серверы на регулярной основе и переходить к более важным вещам.


2
Я никогда не работал в компании, которая перезагружала свой сервер еженедельно ... даже менее ежедневно. Я согласен, что стоимость исправления утечки может быть слишком высокой, чтобы исправить ее, но такое мышление не годится ИМО
Rémi

@ Rémi Большинство, если не все, игровые серверы MMO работают, как правило, еженедельно.
Сьерд

35

Для коротких программ утечки памяти не так важны; ОС восстановит все после завершения, но они могут привести к тому, что другие ресурсы не будут освобождены.

Несмотря на относительную кратковременность, утечка может выйти из-под контроля через несколько часов или накапливаться в течение нескольких недель незамеченным.

Мой совет - подать ошибку в трекере с предложенным исправлением, если лидеру все равно, он исправит это.

Тип утечки также важен. Возможно, что утечка распределения является одноразовой, когда разработчик сознательно полагался на ОС для очистки. Это даст ложный положительный результат на валгринде.


4
Я в основном согласен. Однако я предлагаю вам подчеркнуть важность утечки памяти. Утечки памяти не следует воспринимать легкомысленно и могут вызвать некоторые интересные «особенности» вашего приложения.
Владимир Кочанчич

@VladimirKocjancic: +1 за «фичу»
Эмилио Гаравалья

1
Я просто хочу отметить, что компьютер способен выполнять эту миллионную обработку несколько миллионов раз довольно быстро. Никогда не забывай это. Так что, если принять это во внимание, я согласен с этим ответом, потому что он действительно зависит от программы. Для встроенной системы, предназначенной для работы без вмешательства человека, утечки памяти смертельны. Для реализации "grep" вам, вероятно, наплевать.
Данк

2
@Dunk: Это зависит: если вы grepпросматриваете очень большой файл и ваша программа пропускает несколько байтов для каждой строки ввода, вам может не хватить памяти.
Джорджио

0

По моему общепризнанному догматическому мнению по этому вопросу, нет никаких оправданий физическим утечкам, по крайней мере, в любой библиотеке, которая стремится быть широко применимой. Так что я буду стремиться к ошибкам разработчиков GTK +, пока они сами не исправят это.

Для библиотеки достаточно просто зарегистрировать atexitобратные вызовы, чтобы освободить любую память, которую она выделяет, по крайней мере, после выгрузки. Если он хочет избежать расходов на малюсенькие ассигнования, он не должен делать их в первую очередь.

Даже самая ленивая программа, которая просто хочет выделить кучу маленьких кусочков памяти, может использовать простой последовательный распределитель, который просто удаляет всю память при завершении работы. Если распределитель даже не хочет иметь дело с выравниванием, он может просто заполнить каждый отдельный кусок, который он объединяет, до максимальных границ выравнивания. Если бы он смог выиграть с более быстрым временем выключения, не освобождая все эти крошечные куски памяти по отдельности, он также выиграет симметрично в обмен на тривиальные усилия, используя такой последовательный распределитель, который объединяет память в прямом последовательном режиме с гораздо быстрее, чем распределениеmallocи более дружественные к кешу шаблоны памяти, только чтобы все большие блоки непрерывной памяти, объединенные распределителем, были освобождены, когда библиотека будет готова. Вся библиотека должна сделать, это заменить их mallocвызовы , на которые они не удосужились freeчто - то вроде seq_malloc, и вызов seq_purgeв функции atexitобратного вызова , чтобы освободить всю память , выделенную при выгрузке.

В противном случае вы получите эту грязную библиотеку, загромождающую сообщения в ваших инструментах обнаружения утечек памяти, которые вы теперь должны отфильтровать. Хуже того, если вы не будете систематически отфильтровывать их, они могут скрыть утечки в вашем собственном приложении, и у ваших коллег может развиться привычка игнорировать их, что снизит полезность инструментов обнаружения утечек, в первую очередь, в предотвращении вашей собственной команды толкая негерметичный код. Это грубо и безобразно, и больше всего я не нахожу аргументы в пользу того, чтобы делать это намеренно, было бы убедительным, учитывая, насколько тривиально использовать вышеуказанное решение.

Логические утечки (более сложный вид, от которого не может защитить даже сборка мусора) - более сложная проблема, и там я мог бы найти какое-то оправдание для недолговечных программ иметь логические утечки, если они очищают всю память, выделенную для них. завершение работы, так как для избежания логических утечек необходимо много думать об управлении ресурсами (возможно, в большей степени в языках с GC). Но я не нахожу разумного оправдания, чтобы избежать физических утечек, учитывая, насколько банально их избегать даже в самых ленивых ситуациях.

Во всяком случае, по крайней мере, я бы отфильтровал утечки в Valgrind, чтобы они, по крайней мере, не мешали способности вашей команды определять вашу собственную.


1
Интересно, имеют ли утечки какое-либо отношение к "кодированию лодки"?

0

FWIW, если пользователь сообщил об утечке в приложении, над которым я работаю, я был бы очень склонен исправить это (особенно если бы они включили код для исправления в отчет об ошибке!). Тем не менее, это может произойти не сразу, если утечка будет небольшой, а другие проблемы будут более актуальными (скажем, часто возникающая ошибка). Но я определенно буду признателен за это и постараюсь все исправить. Вы должны обязательно дать им знать. Они либо оценят это, и позаботятся об этом (скорее всего), либо им все равно, и все это будет стоить вам времени.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.