Утечка памяти
Материал из Википедии — свободной энциклопедии
Уте́чка па́мяти (англ. 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) полностью отказывается от применения механизмов динамического распределения памяти, что исключает подобные ошибки, но существенно ограничивает функциональность программ.
[править] Владеющие указатели
Владеющие указатели позволяют в той или иной мере согласовать время жизни указателя и время жизни объекта, на который он ссылается. Тем не менее, использование владеющих указателей не помогает в случае циклических ссылок между объектами.
[править] Сборка мусора
Некоторые языки программирования (например, Java) предоставляют средства, позволяющие автоматически освобождать неиспользуемую память («сборщик мусора», англ. garbage collector). Сборщики мусора решают также и проблему циклических ссылок, но сборка мусора является крайне ресурсоёмкой операцией. За использование подобных средств приходится расплачиваться быстродействием системы.
Сборка мусора была изобретена Джоном Маккарти примерно в 1959 при разработке языка программирования Лисп, для решения проблем, которые порождало ручное управление памятью.
[править] Перезапуск программы
В тех случаях, когда устранить утечки памяти не представляется возможных, например, при использовании кода, поставляемого в виде программных модулей и изготовленного сторонними разработчиками, применяют своеобразный способ игнорирования утечек. Код, подверженный утечкам, размещают в отдельной программе, а эту программу с нужной периодичностью перезапускают. Запуски и перезапуски программы выполняются внешней программой, которая также подаёт исходные данные и забирает результаты. Поскольку при завершении программы вся память, затребованная ей у операционной системы, возвращается операционной системе, такой метод не позволяет утечкам приобрести катастрофический характер.
[править] Утечка других ресурсов
Также существует ошибка, именуемая утечкой дескрипторов: захваченные дескрипторы не возвращаются операционной системе.
Для борьбы с последствиями таких ошибок разработчики операционных систем вводят в них функциональность, позволяющую ограничивать объём памяти, количество дескрипторов и количество процессорного времени, доступного одному пользователю.
[править] Обнаружение утечек
Для профессиональных языков программирования существуют специальные программы-профилировщики, позволяющие обнаружить в числе прочего и утечки памяти.
[править] См. также
- Динамический анализ кода
- Dmalloc
- Valgrind
- totalview
[править] Ссылки
- DPus: A free tool that shows leaks under windows (buffers, GDI objects, registry keys, user handles, etc…
- Why doesn’t my application release the memory? (Java FAQ)
- Detecting a Memory Leak (Using MFC Debugging Support)
- Is Your Memory Not What It Used To Be?
- Memory Leak Detection in C++
- Memory Leak Detection in Embedded Systems
- Java memory leaks — Catch me if you can
- Sample Chapter from Bitter Java
- Memory Leaks, Be Gone
- Memory Management in Objective-C
- Борьба с утечками ресурсов в реальном времени
Это незавершённая статья о компьютерах. Вы можете помочь проекту, исправив и дополнив её. |
Это незавершённая статья по информатике. Вы можете помочь проекту, исправив и дополнив её. |