Освобождение памяти в C под Linux - PullRequest
1 голос
/ 08 июня 2009

Если вы не освобождаете память, которую вы используете malloc в программе на C под Linux, когда она будет освобождена? После завершения программы? Или память все еще заблокирована до непредвиденного времени (вероятно, при перезагрузке)?

Ответы [ 7 ]

16 голосов
/ 08 июня 2009

Память, выделенная malloc(), освобождается после завершения процесса. Однако память, выделенная с помощью shmget(), не освобождается после завершения процесса. Будьте осторожны с этим.

Edit:

mmap () не является shmget (), читайте о разнице здесь: http://www.opengroup.org/onlinepubs/000095399/functions/mmap.html http://www.opengroup.org/onlinepubs/009695399/functions/shmget.html

Это разные системные вызовы, которые делают совершенно разные вещи.

8 голосов
/ 08 июня 2009

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

2 голосов
/ 08 июня 2009

malloc() ed память определенно освобождается после завершения процесса, но не путем вызова free(). это целое отображение памяти (представленное процессу как линейное ОЗУ), которое просто удаляется из таблиц MMU.

1 голос
/ 12 июня 2009

Распределение памяти имеет два разных значения, которые обычно пересекаются в подобных вопросах.

  • память сделана доступной для процесса системным вызовом sbrk
  • памяти назначается для некоторой цели в контексте программы с помощью malloc ()

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

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

когда вы посмотрите на вывод top, вы увидите два числа для использования памяти процессами. Один для «виртуального размера» и «резидентного размера», виртуальный размер - это общая сумма, к которой процесс запросил доступ. размер резидента - это сумма, которая активно используется процессом в данный момент.

1 голос
/ 08 июня 2009

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

0 голосов
/ 08 июня 2009

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

0 голосов
/ 08 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...