Linux гарантирует освобождение памяти malloc'd при выходе из программы? - PullRequest
0 голосов
/ 22 ноября 2018

Раньше я считал, что это так, но ... я не могу найти это прямо заявленным.

man 3 exit и man 2 _exit многословноукажите эффекты завершения процесса, но не упоминайте утечки памяти.

Posix подходит ближе: он упоминает это:

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

  • [TYM] [Option Start] Любые блоки типизированной памяти, которые были отображены в вызывающем процессе, должны бытьunmapped, как если бы неявно вызывался munmap() для их отображения.[Option End]

Смешивание этого с man 3 malloc:

Обычно malloc() выделяет память изкуча и корректирует размер кучи по мере необходимости, используя sbrk(2).При выделении блоков памяти размером более MMAP_THRESHOLD байт реализация glibc malloc() выделяет память как частное анонимное отображение, используя mmap(2).

. Таким образом, можно сделать вывод, что если malloc вызываетсяmmap тогда завершение процесса может сделать соответствующий вызов munmap, НО ... (a) теги "необязательной функции" в этой спецификации POSIX вызывают беспокойство, (b) Это mmap, но как насчет sbrk?(c) Linux не на 100% совместим с POSIX, поэтому я не уверен, является ли обязательным смешивание документов Linux со спецификациями Posix

Причина, по которой я спрашиваю, заключается в следующем ... Когда происходит сбой вызова библиотеки,разрешено просто выйти?

if(somecall() == -1) {
    error(EXIT_FAILURE, errno, "Big fat nasty error.\n");
}

Или мне нужно подняться в стек, чтобы убедиться, что все, вплоть до main(), равно free() 'd и только вызывать exit или errorв main()?

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

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Я уверен, что комитет POSIX предполагал, что вся память, выделенная malloc, должна быть освобождена как одно из «последствий завершения процесса», перечисленных в спецификации _exit, с которой вы связаны.Я также могу сказать вам, что на практике каждая реализация Unix, которую я когда-либо использовал, делала это.

Тем не менее, я думаю, что вы нашли подлинный пробел в спецификациях.POSIX ничего не говорит о памяти, выделенной sbrk, потому что вообще не указывает sbrk.Его спецификация для malloc более или менее взята дословно из стандарта C, а стандарт C намеренно не говорит, что вся память, выделенная malloc, должна быть освобождена после «нормального завершения»потому что существуют встроенные среды, которые этого не делают.И, как вы указали, «отображения памяти, которые были созданы в процессе», можно было прочитать для применения только к выделениям, сделанным непосредственно mmap, shmat и подобными.Возможно, стоит подать запрос на устный перевод в Austin Group.

0 голосов
/ 22 ноября 2018

Это «освобождение» выполняется на уровне ядра.Таким образом, вы вряд ли найдете что-либо прямое в спецификациях POSIX API или C, так как виртуальная память намного «ниже» их.Таким образом, вы вряд ли найдете что-нибудь подходящее - не говоря уже о гарантии .

. В Linux ядро ​​освобождает память при выходе из процесса (как sbrk, так и mmap), что гарантировано.См. исходный код mm .

. При сбое вызова библиотеки я могу просто выйти?

Да.Это нормально.

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

Подробнее о Virtual Memory Manager можно узнать (он основан на старыхядро но идея все еще применима).

...