При выходе из приложения C память malloc-редактора автоматически освобождена?

Скажем, у меня есть следующий код C:

int main () {
  int *p = malloc(10 * sizeof *p);
  *p = 42;
  return 0;  //Exiting without freeing the allocated memory
}

Когда я скомпилирую и выполняю это, программа C, т.е. после выделения некоторого места в памяти, будет та память, которую я выделил быть все еще выделенным (т.е. в основном занимание места) после того, как я выхожу из приложения, и процесс завершается?

85
задан Andreas Grech 6 February 2010 в 15:37
поделиться

7 ответов

Это действительно зависит от операционной системы, но для всех операционных систем, с которыми вы когда-либо столкнетесь, выделение памяти исчезнет после завершения процесса.

-121--815507-

Да, операционная система освобождает всю память после завершения процесса.

-121--815505-

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

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

104
ответ дан 24 November 2019 в 08:17
поделиться

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

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

  • Если у вас есть дополнительные ресурсы, которые не очищаются ОС при выходе, такие как временные файлы или любое изменение состояния внешнего ресурса, тогда вам понадобится код для обработки всех этих вещей при выходе, и это часто элегантно сочетается с освобождением памяти.
  • Если ваша программа начинает иметь более продолжительный срок службы, тогда вы не захотите, чтобы только способ освобождения памяти оставался для выхода. Например, вы можете преобразовать свою программу в сервер (демон), который продолжает работать, обрабатывая множество запросов для отдельных единиц работы, или ваша программа может стать небольшой частью более крупной программы.

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

В качестве связанного примера, существуют высокопроизводительные серверы, которые работают, создавая процесс для каждого запроса, а затем заставляя его завершиться, когда он будет выполнен; это означает, что им даже не нужно отслеживать выделение памяти и вообще никогда не производить никакого освобождения или сборки мусора, поскольку все просто исчезает обратно в свободную память операционной системы в конце процесса. (То же самое можно сделать в процессе с использованием специального распределителя памяти, но это требует очень тщательного программирования; по сути, создание собственного понятия «легковесные процессы» в процессе ОС.)

43
ответ дан 24 November 2019 в 08:17
поделиться

Что здесь происходит ( в современной ОС ), так это то, что ваша программа выполняется внутри своего собственного «процесса». Это объект операционной системы, наделенный собственным адресным пространством, файловыми дескрипторами и т. Д. Ваши вызовы malloc выделяют память из «кучи» или нераспределенных страниц памяти, которые назначены вашему процессу.

Когда ваша программа завершается, как в этом примере, все ресурсы, назначенные вашему процессу, просто перерабатываются / уничтожаются операционной системой. В случае с памятью все назначенные вам страницы памяти просто помечаются как «свободные» и используются для использования другими процессами. Страницы представляют собой концепцию более низкого уровня, чем то, что обрабатывает malloc - в результате все особенности malloc / free просто стираются, когда все это очищается.

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

Все это говорит о том, что, как отмечают все другие респонденты, полагаться на это - не лучшая практика:

  1. Вы всегда должны программировать так, чтобы заботиться о ресурсах, а в C это также означает память. В конечном итоге вы можете встроить свой код в библиотеку или он может работать намного дольше, чем вы ожидаете.
  2. Некоторые ОС (более старые и, возможно, некоторые современные встроенные) могут не поддерживать такие жесткие границы процессов, и ваше распределение может повлиять на адресные пространства других.
6
ответ дан 24 November 2019 в 08:17
поделиться

Да. Операционная система очищает ресурсы. Ну ... старые версии NetWare этого не делали.

Правка: Как отметил Сан-Хасинто, безусловно, существуют системы (кроме NetWare), которые этого не делают. Даже в бросающих вызов программах я стараюсь сделать привычку освобождать все ресурсы просто для того, чтобы сохранить эту привычку.

4
ответ дан 24 November 2019 в 08:17
поделиться

Это зависит от того, операционные системы обычно очищают его за вас, но если вы работаете, например, над встроенным программным обеспечением, оно может не быть выпущено.

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

2
ответ дан 24 November 2019 в 08:17
поделиться

Да, операционная система освобождает всю память по завершении процесса.

2
ответ дан 24 November 2019 в 08:17
поделиться

Это действительно зависит от операционной системы, но для всех операционных систем, с которыми вы когда-либо столкнетесь, выделение памяти исчезнет при выходе из процесса.

0
ответ дан 24 November 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: