我曾经认为它肯定会,但是……我找不到明确说明。
man 3 exit
和 man 2 _exit
详细说明了进程终止的影响,但没有提到内存泄漏。
Posix 更接近答案:它提到了这个:
在进程被销毁之前,将在进程中创建的内存映射取消映射。
[TYM] [Option Start] 将取消映射在调用进程中映射的任何类型内存块,就像隐式调用
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并不完全符合POSIX标准,因此我不确定是否强制混合使用Linux文档和POSIX规范。我提问的原因是...当库调用失败时,我是否可以直接退出?
if(somecall() == -1) {
error(EXIT_FAILURE, errno, "Big fat nasty error.\n");
}
或者我需要向上遍历整个堆栈,确保一直到
main()
的所有内容都被free()
,并且只在main()
中调用exit
或error
吗?前者要简单得多。但是为了感觉容易处理前者,我想在文档中找到明确提到这不是错误,并且这样做是安全的。正如我所说,文档关注明确提到许多将被清理的保证,但未提及此特定保证使我不安。(难道这不是最常见和最明显的情况吗?这不应该首先提到吗?)