Раньше я считал, что это так, но... Я не могу найти это прямо заявленным.
man 3 exit
и man 2 _exit
подробно определяют эффекты завершения процесса, но не упоминают утечки памяти.
Posix подходит ближе: он упоминает это:
Отображения памяти, которые были созданы в процессе, должны быть удалены, прежде чем процесс будет уничтожен.
[TYM] [Option Start] Любые блоки типизированной памяти, которые были отображены в вызывающем процессе, должны быть не отображены, как если
munmap()
неявно вызывалсяmunmap()
для их отображения. [Вариант Конец]
Смешивая это с man 3 malloc
:
Обычно
malloc()
выделяет память из кучи и корректирует размер кучи по мере необходимости, используяsbrk(2)
. При выделении блоков памяти, превышающих байтыMMAP_THRESHOLD
, реализация glibcmalloc()
выделяет память как частное анонимное отображение, используя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()
и будет вызывать только exit
или error
в main()
?
Первое намного проще. Но чтобы чувствовать себя спокойно с первым, я хотел бы найти это в документах, в которых четко указано, что это не ошибка и что это безопасно. Как я уже сказал, тот факт, что документы заботятся о том, чтобы явно упомянуть ряд гарантий того, что обязательно будет убрано, НО, не упоминает эту конкретную гарантию, меня тревожит. (Разве это не самый распространенный и наиболее очевидный случай? Разве это не будет упомянуто в первую очередь?)