我的一些同事提出了一个有趣的观点,其中一些人声称无论如何你都应该free
你malloc
的记忆。虽然我一直认为这通常是很好的做法,但其他一些人认为在以下程序中没有必要:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char *mem = malloc (1000);
if (mem != NULL) {
// do something with mem
}
// memory not freed
return 0;
}
他们声称,当进程退出时,内存将被清理。
现在,作为当地标准的超级极客,他们向我寻求澄清,令我惊讶的是,似乎永远免费的人群实际上可能是正确的。
转向C11,5.1.2.2.3 Program termination
,它只是说到达main
的末尾与调用exit
相同。
7.22.4.4 The exit function
列出了那些需要清理的内容,特别是:
- 调用所有
atexit
处理程序。 - 将刷新所有具有未写入缓冲的打开流。
- 所有打开的流都已关闭。
tmpfile
创建的所有文件都将关闭。- 控制权返回到环境。
其中没有提到清理分配的内存。
现在看6.2.4 Storage duration of objects
,它提到了四个存储持续时间,其中"分配"是这里感兴趣的一个。它进一步指出:
7.22.3 中介绍了分配的存储。
7.22.3 Memory management functions
决定了我们所有最喜欢的人的行为,比如malloc
和free
。它从未提及在进程终止之前尚未释放的内存会发生什么情况。它只是说:
已分配对象的生存期从分配一直延伸到解除分配。
请记住,这不是一个关于实现做什么的问题 - 我很清楚,我见过的几乎每个实现都将其内存领域存储在进程空间中,并且在进程退出时被丢弃。这是ISO C标准所允许的。
我在标准中找不到任何强制要求这种"终止时释放"行为的内容,因此分配的内存在进程终止后幸存下来的实现是可行的(例如,想想使用持久共享内存的malloc
(。
所以问题来了。是否有可能(根据 ISO C(分配的内存即使在分配它的进程消失后仍可能继续消耗资源?
还是我错过了标准中使这变得毫无意义的某些东西?
在程序终止后清理分配的内存属于操作系统的范围,而不是 C 标准。
据我所知,一旦程序终止,大多数主要操作系统确实会释放所有分配的内存。例外可能是嵌入式操作系统,但是我还没有可靠的材料来支持这一点。
编辑:讨论同一问题的另一个线程 - 程序终止后动态分配的内存