我的一些同事提出了一个有趣的观点,其中一些人声称无论如何你都应该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)即使在分配它的进程消失后仍可能继续消耗资源?
或者我是否遗漏了标准中的某些内容?