在程序终止后,ISO C是否允许分配的内存闲置?

pax*_*blo 5 c malloc iso termination

我的一些同事出现了一个有趣的观点,一些人声称你应该永远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;
}
Run Code Online (Sandbox Code Playgroud)

他们声称在进程退出时将清理内存.

现在,作为当地的标准超级怪人,他们向我寻求澄清,令我惊讶的是,似乎永远自由的人群实际上可能是正确的.

转向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决定我们所有喜欢的行为,如mallocfree.在任何时候都没有提到在进程终止之前未释放的内存会发生什么.它只是声明:

分配对象的生命周期从分配延伸到解除分配.

请记住,这不是一个关于什么实现的问题 - 我很清楚,我见过的每一个实现都会在进程空间中存储它的内存区域,并且当进程退出时它会被丢弃.这是ISO C标准所允许的.

我无法在标准中找到任何强制执行 "free on terminate"行为的内容,因此分配内存在进程终止时幸存的实现是可行的(例如,考虑malloc使用持久共享内存的实现).

所以这就是问题所在.是否有可能(根据ISO C)分配的内存可能会继续消耗资源,即使分配它的进程已经消失了?

或者我是否错过了标准中的某些内容?

Kar*_*k T 7

程序终止后清除已分配的内存属于操作系统的范围,而不是C标准.

据我所知,一旦程序终止,大多数主要操作系统会实际释放所有已分配的内存.例外情况可能是嵌入式操作系统,但我还没有坚实的材料来支持这一点.

编辑:另一个讨论相同问题的线程 - 在程序终止后动态分配内存