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

时间:2013-02-08 02:01:55

标签: 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;
}

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

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

转到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)分配的内存可能会继续消耗资源,即使分配它的进程已经消失了?

或者我是否错过了标准中的某些内容,这使得这一点没有意义?

1 个答案:

答案 0 :(得分:7)

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

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

编辑:讨论同一问题的另一个主题 - dynamically allocated memory after program termination