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