Почему утечки памяти распространены? - PullRequest
8 голосов
/ 27 января 2010

Это из-за базового недопонимания того, как память динамически распределяется и освобождается со стороны программиста? Это из-за самоуспокоенности?

Ответы [ 5 ]

15 голосов
/ 27 января 2010

Нет.Это связано с огромным объемом учета, необходимого для отслеживания каждого распределения памяти.Кто отвечает за распределение памяти?Кто несет ответственность за его освобождение?Обеспечение того, чтобы вы использовали один и тот же API для выделения и освобождения памяти и т. Д. Гарантирование того, что вы перехватываете все возможные программные потоки и выполняете очистку в любой ситуации (например, убедитесь, что выполняете очистку после того, как обнаружите ошибку или исключение).Список можно продолжить ...

3 голосов
/ 27 января 2010

В приличном размере проект может потерять отслеживание выделенных ресурсов.

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

Утечки памяти вызваны основными недоразумениями в том же смысле каждая ошибка . И я был бы шокирован, когда узнал, что кто-то каждый раз пишет код без ошибок. Утечки памяти как раз и являются той ошибкой, которая редко приводит к сбою или явно неправильному поведению (конечно, помимо использования слишком большого объема памяти), поэтому, если утечки памяти не будут явно проверены для разработчика, они, вероятно, никогда не узнают о их наличии. Учитывая, что изменения в кодовой базе всегда добавляют ошибки, а утечки памяти практически незаметны, утечки памяти увеличиваются по мере старения и увеличения размера программы.

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

2 голосов
/ 27 января 2010

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

Поскольку в вашем вопросе не упоминается язык, сегодня существует автоматическое управление памятью, которое заботится об учете / отслеживании памяти, чтобы гарантировать отсутствие утечек памяти, подумайте Java / .NET, но некоторые могут проскользнуть через сеть. Это было бы с подобными C / C ++, которые используют функции malloc / new, и их неизменно сложнее проверять из-за огромного объема выделяемой памяти.

Опять же, отследить эти утечки может быть сложно найти, который бросает еще один кривая в этот ответ - если он работает на машине разработчика, он не обнаруживается, но при работе память начинает протекать черт возьми, это конфигурация, аппаратное обеспечение, конфигурация программного обеспечения или что-то еще, утечка памяти может возникать в случайной ситуации, которая уникальна для производственной среды, или это ограничение времени / затрат, которое допускает утечки памяти или из-за того, что инструменты профилирования памяти являются непомерно дорогостоящими или не имеют достаточного финансирования, чтобы помочь команде разработчиков отследить утечки ...

В общем, каждый в команде разработчиков несет ответственность за то, чтобы код работал, и знает правила управления памятью (например, например, для каждого malloc должно быть free, для каждого new должно быть delete), но не следует винить в этом сами команды разработчиков и указывать пальцем на руководство для «накопления давления на команду разработчиков».

В конце концов, было бы ложной экономией полагаться только на команду разработчиков и возлагать «самодовольство» на их плечи.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 27 января 2010

Отсутствие структурированных областей и четкое владение выделенной памятью.

1 голос
/ 27 января 2010
  1. Bugs.

  2. Даже без ошибок может быть невозможно заранее узнать, какая функция должна освободить память. Это достаточно просто, если структура кода по существу функциональна (основная функция вызывает подфункции, которые обрабатывают данные, а затем возвращают результат), но это не тривиально, если несколько протекторов (или несколько различных объектов) совместно используют часть памяти. Можно использовать умные указатели (в C ++), но в противном случае это более или менее невозможно.

  3. Утечки - не худший вид ошибки. Их эффект - это всего лишь совокупное снижение производительности (до тех пор, пока у вас не закончится память), поэтому они не имеют такого высокого приоритета.

...