#c #memory #memory-management #pointers #malloc
#c #память #управление памятью #указатели #malloc
Вопрос:
Я прочитал это-
Память, которая выделяется malloc (например) и которая не освобождается с помощью функции free(), освобождается при завершении программы.И что это делается операционной системой. Итак, когда возникает вопрос о наличии или отсутствии сборщика мусора?
Или дело в том, что не все операционные системы выполняют это автоматическое освобождение памяти при завершении программы?
Комментарии:
Ответ №1:
Это утверждение о malloc
и free
верно для всех современных вычислительных операционных систем. Но утверждение в целом отражает полное непонимание цели сборки мусора.
Причина, по которой вы вызываете free
, заключается не в том, чтобы произвести очистку после завершения работы вашей программы. Причина, по которой вы вызываете free
, заключается в том, чтобы разрешить повторное использование памяти во время последующего выполнения длительно выполняющейся программы.
Рассмотрим сервер сообщений, который обрабатывает сотню сообщений в секунду. Вы вызываете, malloc
когда получаете новое сообщение. И тогда вам придется много чего с ней делать. Возможно, вам придется записать это в журнал. Возможно, вам придется отправить ее другим клиентам. Возможно, вам придется записать ее в базу данных. Когда вы закончите, если вы этого не сделаете free
, через несколько дней у вас будут миллионы сообщений, застрявших в памяти. Итак, вам придется вызвать free
.
Но когда вы вызываете free
? Когда один клиент закончит отправку сообщения, другой клиент может все еще использовать его. И, возможно, база данных все еще нуждается в ней.
Цель сборки мусора — гарантировать, что используемая память объекта освобождена (чтобы ее можно было повторно использовать для хранения нового сообщения в течение срока службы приложения), не обременяя прикладного программиста обязанностью (и рисками), связанными с точным отслеживанием того, когда объект больше не требуется какому-либо коду, который мог бы его использовать.
Если приложение выполняется не очень долго или не имеет каких-либо объектов, время жизни которых трудно определить, то от сборки мусора мало пользы. И существуют другие методы (такие как указатели с подсчетом ссылок), которые могут обеспечить многие из тех же преимуществ, что и сборка мусора. Но есть реальная проблема, которую решает сборка мусора.
Ответ №2:
Большинство современных операционных систем действительно освободят все, что вам выделено при завершении программы. Однако сборщик мусора освободит неиспользуемую память перед завершением программы. Это позволяет вашей программе пропускать освобождения, но при этом продолжать выделять память неограниченно долго, пока это позволяет переходить к ссылкам на память, которая больше не используется, и пока общий размер вашего рабочего набора не превышает пределы физической памяти.
Ответ №3:
Все ОС освобождают память при завершении программы. Утечки памяти — это «всего лишь» проблема, потому что они расходуют память на компьютере или вызывают сбой программы. Таким образом, вы бы собирали мусор, чтобы предотвратить подобные вещи, но не беспокоясь о фактическом освобождении ваших собственных указателей, когда вы закончите с ними.
На самом деле это два решения одной и той же проблемы. Но вас беспокоит то, что проблема возникает во время выполнения.
Комментарии:
1. Как вы можете говорить «Все», если вы имеете в виду «все популярные» (BSD / Linux / Windows)? Есть некоторые все еще используемые многозадачные операционные системы, в которых даже нет защиты памяти между процессами.
2. «Современная, часто используемая» между «всеми» и «ОС», я думаю, подразумевалось. Код, который запускает мой телевизор, вероятно, также не освобождает память автоматически, но это на самом деле не имеет значения.
Ответ №4:
Представьте себе долго выполняющийся процесс, подобный веб-серверу, который malloc()
содержит множество структур данных для каждого соединения, которое он обслуживает. Если она никогда free()
не используется ни в одной из этих областей памяти, использование памяти процесса будет постоянно расти, возможно, потребляя все, что доступно в системе.