<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.104.184.238</id>
	<title>wiki12 - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.104.184.238"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/95.104.184.238"/>
	<updated>2026-07-17T14:20:04Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A3%D1%82%D0%B5%D1%87%D0%BA%D0%B0_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8&amp;diff=14721</id>
		<title>Утечка памяти</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A3%D1%82%D0%B5%D1%87%D0%BA%D0%B0_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8&amp;diff=14721"/>
		<updated>2025-03-25T15:23:16Z</updated>

		<summary type="html">&lt;p&gt;95.104.184.238: /* Что такое утечка памяти */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{другие значения|Утечка}}&lt;br /&gt;
&#039;&#039;&#039;Уте́чка па́мяти&#039;&#039;&#039; ({{lang-en|memory leak}}) — процесс неконтролируемого уменьшения объёма свободной [[оперативная память|оперативной]] или [[виртуальная память|виртуальной]] [[компьютерная память|памяти]] [[компьютер]]а, связанный с ошибками в работающих [[компьютерная программа|программах]], вовремя не освобождающих память от ненужных данных, или с ошибками системных служб контроля памяти.&lt;br /&gt;
&lt;br /&gt;
== Что такое утечка памяти ==&lt;br /&gt;
Рассмотрим следующий фрагмент кода на [[C++]]:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
char* pointer = nullptr;&lt;br /&gt;
for (int i = 0; i &amp;lt; 100; ++i) {&lt;br /&gt;
  pointer = new char[100];&lt;br /&gt;
}&lt;br /&gt;
delete[] pointer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В этом примере на 3-й строке создается объект в динамической памяти. Код на 3-й строке выполняется 100 раз, причём каждый следующий раз адрес нового объекта перезаписывает значение, хранящееся в указателе pointer. На 5-й строке выполняется удаление объекта, созданного на последней итерации цикла. Однако первые 99 объектов остаются в динамической памяти, и одновременно в программе не остаётся переменных, которые бы хранили адреса этих объектов. То есть в 5-й строке невозможно ни получить доступ к первым 99 объектам, ни удалить их. Плохая оптимизация программы может привести к плохим последствиям&lt;br /&gt;
&lt;br /&gt;
== Чем опасны утечки памяти ==&lt;br /&gt;
Динамическая память является ограниченным ресурсом. Управление динамической памятью программы обычно осуществляется библиотекой языка программирования, которая сама работает поверх динамической памяти, предоставляемой операционной системой.&lt;br /&gt;
&lt;br /&gt;
Утечки памяти приводят к тому, что потребление памяти программой неконтролируемо возрастает, в результате рано или поздно вступают в действие архитектурные ограничения [[Среда выполнения|среды исполнения]] ([[Операционная система|операционной системы]], [[Виртуальная машина|виртуальной машины]], [[ЭВМ]]), и тогда новое выделение памяти становится невозможным. В этой ситуации в программе, которая запрашивает память, обычно происходит [[аварийный останов]]. Это может по стечению обстоятельств произойти и совсем с другой программой после того, как программа, подверженная утечкам, исчерпает всю память ЭВМ.&lt;br /&gt;
&lt;br /&gt;
== Способы предотвращения ==&lt;br /&gt;
Существуют различные способы предотвращения утечек памяти.&lt;br /&gt;
&lt;br /&gt;
=== Отказ от динамической памяти ===&lt;br /&gt;
Например, [[Фортран|FORTRAN-77]] полностью отказывается от применения механизмов динамического распределения памяти, что исключает подобные ошибки, но существенно ограничивает функциональность программ.&lt;br /&gt;
&lt;br /&gt;
=== Владеющие указатели ===&lt;br /&gt;
{{main|Умный указатель}}&lt;br /&gt;
&lt;br /&gt;
Владеющие указатели позволяют в той или иной мере согласовать время жизни указателя и время жизни объекта, на который он ссылается. Тем не менее, использование владеющих указателей не помогает в случае циклических ссылок между объектами. (подробнее см. паттерн «[[Получение ресурса есть инициализация]]»)&lt;br /&gt;
&lt;br /&gt;
=== Сборка мусора ===&lt;br /&gt;
{{main|Сборка мусора (программирование)}}&lt;br /&gt;
&lt;br /&gt;
Некоторые языки программирования (например, [[Оберон (язык программирования)|Оберон]], [[Java]], [[Список .NET-языков|языки платформы .NET]]) предоставляют средства, позволяющие автоматически освобождать неиспользуемую память («[[Сборка мусора (программирование)|сборщик мусора]]», {{lang-en|garbage collector}}). Сборщики мусора решают также и проблему циклических ссылок, но сборка мусора является ресурсоёмкой операцией. За использование подобных средств приходится расплачиваться быстродействием системы, и, главное, сборка мусора вносит неожиданные паузы в программу, что недопустимо в [[Система реального времени|системах реального времени]].&lt;br /&gt;
&lt;br /&gt;
Сборка мусора была изобретена Джоном Маккарти примерно в [[1959 год]]у при разработке языка программирования [[Лисп]], структура которого делает крайне затруднительным ручное управление памятью.&lt;br /&gt;
&lt;br /&gt;
=== Перезапуск программы ===&lt;br /&gt;
В тех случаях, когда устранить утечки памяти не представляется возможным, например, при использовании кода, поставляемого в виде программных модулей и изготовленного сторонними разработчиками, применяют своеобразный способ игнорирования утечек. Код, подверженный утечкам, размещают в отдельной программе, а эту программу с нужной периодичностью перезапускают. Запуски и перезапуски программы выполняются внешней программой, которая также подаёт исходные данные и забирает результаты. Поскольку при завершении программы вся память, затребованная ей у операционной системы, возвращается операционной системе, такой метод не позволяет утечкам приобрести катастрофический характер.&lt;br /&gt;
&lt;br /&gt;
== Утечка других ресурсов ==&lt;br /&gt;
Также существует ошибка, именуемая [[утечка дескрипторов|утечкой дескрипторов]]: захваченные [[дескриптор]]ы не возвращаются операционной системе. Соответственно бывает утечка ресурсов [[GDI]], сетевых соединений, открытых файлов…&lt;br /&gt;
&lt;br /&gt;
Для борьбы с последствиями таких ошибок разработчики [[операционная система|операционных систем]] вводят в них функциональность, позволяющую ограничивать объём памяти, количество дескрипторов и количество процессорного времени, доступного одному пользователю или конкретному процессу.&lt;br /&gt;
&lt;br /&gt;
== Обнаружение утечек ==&lt;br /&gt;
Для профессиональных языков программирования существуют специальные [[Профилирование (информатика)|программы-профилировщики]], позволяющие обнаружить в числе прочего и утечки памяти.&lt;br /&gt;
&lt;br /&gt;
Для некоторых языков программирования существуют [[статический анализ кода|статические анализаторы кода]], выявляющие элементы программы, потенциально способные приводить к логическим ошибкам, в том числе и к утечке памяти. Примитивный вариант такого анализатора реализует практически любой компилятор языка высокого уровня, в виде выдачи так называемых предупреждений (warnings) — сообщений о наличии в программе конструкций, формально не нарушающих синтаксис языка, но потенциально ошибочных.&lt;br /&gt;
&lt;br /&gt;
Существуют библиотеки для [[Отладчик использования памяти|отладки использования памяти]], помогающие следить за выделением и освобождением памяти во время работы программы.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Динамический анализ кода]]&lt;br /&gt;
* [[Dmalloc]]&lt;br /&gt;
* [[Valgrind]]&lt;br /&gt;
* [[totalview]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://linuxjournal.com/article.php?sid=6059 Memory Leak Detection in Embedded Systems] {{Архивировано|url=https://archive.today/20121209063515/http://linuxjournal.com/article.php?sid=6059 |date=2012-12-09 }}&lt;br /&gt;
* [http://www.ibm.com/developerworks/rational/library/05/0816_GuptaPalanki/ Java memory leaks — Catch me if you can]&lt;br /&gt;
* [http://java.sun.com/developer/Books/javaprogramming/bitterjava/bitterjavach06.pdf Sample Chapter from Bitter Java]&lt;br /&gt;
* [http://dev2dev.bea.com/pub/a/2005/06/memory_leaks.html Memory Leaks, Be Gone]&lt;br /&gt;
* [http://www.macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html Memory Management in Objective-C]&lt;br /&gt;
* [http://www.xakep.ru/post/41631/default.asp Борьба с утечками ресурсов в реальном времени]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Ошибки программирования]]&lt;br /&gt;
[[Категория:Программистский сленг]]&lt;/div&gt;</summary>
		<author><name>95.104.184.238</name></author>
	</entry>
</feed>