Утечки памяти

Утечки памяти

Уте́чка па́мяти (англ. memory leak) — процесс неконтролируемого уменьшения объёма свободной оперативной памяти (RAM) компьютера, связанный с ошибками в работающих программах, вовремя не освобождающих ненужные уже участки памяти, или с ошибками системных служб контроля памяти.

Содержание

Что такое утечка памяти

Рассмотрим следующий фрагмент кода на C++:

/*1*/ char* pointer = 0;
/*2*/ for( int i = 0; i < 10; i++ ) {
/*3*/   pointer = new char[100];
/*4*/ }
/*5*/ delete [] pointer;

В этом примере на 3-й строке создается объект в динамической памяти. Код на 3-й строке выполняется 10 раз, причём каждый следующий раз адрес нового объекта перезаписывает значение, хранящееся в указателе pointer. На 5-й строке выполняется удаление объекта, созданного на последней итерации цикла. Однако первые 9 объектов остаются в динамической памяти, и одновременно в программе не остаётся переменных, которые бы хранили адреса этих объектов. Т.е. в 5-й строке невозможно ни получить доступ к первым 9 объектам, ни удалить их.

Чем опасны утечки памяти

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

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

Способы предотвращения

Существуют различные способы предотвращения утечек памяти.

Отказ от динамической памяти

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

Владеющие указатели

Основная статья: Умный указатель

Владеющие указатели позволяют в той или иной мере согласовать время жизни указателя и время жизни объекта, на который он ссылается. Тем не менее, использование владеющих указателей не помогает в случае циклических ссылок между объектами. (подробнее см. описание паттерна "Получение ресурса есть инициализация" (RAII))

Сборка мусора

Основная статья: Сборка мусора

Некоторые языки программирования (например, сборщик мусора», англ. garbage collector). Сборщики мусора решают также и проблему циклических ссылок, но сборка мусора является крайне ресурсоёмкой операцией. За использование подобных средств приходится расплачиваться быстродействием системы.

Сборка мусора была изобретена Джоном Маккарти примерно в 1959 году при разработке языка программирования Лисп, структура которого делает крайне затруднительным ручное управление памятью

Перезапуск программы

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

Утечка других ресурсов

Также существует ошибка, именуемая утечкой дескрипторов: захваченные дескрипторы не возвращаются операционной системе.

Для борьбы с последствиями таких ошибок разработчики операционных систем вводят в них функциональность, позволяющую ограничивать объём памяти, количество дескрипторов и количество процессорного времени, доступного одному пользователю.

Обнаружение утечек

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

См. также

Ссылки



Wikimedia Foundation. 2010.

Игры ⚽ Нужна курсовая?

Полезное


Смотреть что такое "Утечки памяти" в других словарях:

  • ПАМЯТИ УСТРОЙСТВА — (запоминающиеустройства) в вычислит. технике (см. Электронная вычислительная машина )устройства для записи, хранения и воспроизведения информации. В качественосителя информации может выступать физ. сигнал, распространяющийся в среде …   Физическая энциклопедия

  • Утечка памяти — (англ. memory leak) процесс неконтролируемого уменьшения объёма свободной оперативной памяти (RAM) компьютера, связанный с ошибками в работающих программах, вовремя не освобождающих ненужные уже участки памяти, или с ошибками системных служб …   Википедия

  • Динамическое распределение памяти — Динамическое распределение памяти  способ выделения оперативной памяти компьютера для объектов в программе, при котором выделение памяти под объект осуществляется во время выполнения программы. При динамическом распределении памяти объекты… …   Википедия

  • Модель памяти в языке Си — Модель памяти в языке Си  система хранения объектов в языке Си.[1] Способ хранения объекта в языке Си определяет его время жизни  часть времени выполнения программы, во время которого объект существует или для него зарезервировано место …   Википедия

  • Контроллер памяти — Контроллер памяти  цифровая схема, управляющая потоком данных к и от оперативной памяти. Может представлять собой отдельную микросхему или быть интегрирована в более сложную микросхему, например, в северный мост, микропроцессор или систему… …   Википедия

  • Сборщик мусора — В программировании сборка мусора (англ. garbage collection, GC) одна из форм автоматического управления памятью. Специальный код, называемый сборщиком мусора (garbage collector), периодически освобождает память, удаляя объекты, которые уже не… …   Википедия

  • Сборщика мусора — В программировании сборка мусора (англ. garbage collection, GC) одна из форм автоматического управления памятью. Специальный код, называемый сборщиком мусора (garbage collector), периодически освобождает память, удаляя объекты, которые уже не… …   Википедия

  • Сборка мусора — Для улучшения этой статьи желательно?: Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное. Викифицировать статью …   Википедия

  • История Mozilla Firefox — Объединить Mozilla Firefox …   Википедия

  • Динамический анализ кода — (англ. Dynamic program analysis)  анализ программного обеспечения, выполняемый при помощи выполнения программ на реальном или виртуальном процессоре (анализ, выполняемый без запуска программ называется статический анализ кода). Утилиты… …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»