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