假设我有以下C代码:
int main () {
int *p = malloc(10 * sizeof *p);
*p = 42;
return 0; //Exiting without freeing the allocated memory
}
当我编译并执行该C程序时,即在内存中分配了一些空间后,我退出应用程序并终止进程后,分配的内存是否仍会分配(即,基本上占用了空间)?
清理内存的"好方式",不是因为您可能在没有受保护的内存的操作系统上运行(这是下面的主要建议),而是因为它增加了您发现内存泄漏并保持代码精简和 正确...
这取决于操作系统。当程序结束时,大多数现代(以及所有主要)操作系统将释放程序未释放的内存。
依靠这种做法是不好的做法,最好将其明确释放。问题不仅仅在于您的代码看起来不好。您可能会决定要将小程序集成到一个较大的,长期运行的程序中。然后过了一会儿,您必须花费数小时来跟踪内存泄漏。
依靠操作系统的功能还使代码的可移植性降低。
我曾经在嵌入式平台上遇到过win98,根据这种经验,我可以说程序关闭时它不会释放内存。
"您可能会决定要..."-但比较一下:YAGNI。
@ken;释放资源真的没有工作。
@Ken这是一个例子。此外,YAGNI和草率编码之间也有一条界线。不释放资源会越过它。 YAGNI原则还应应用于功能,而不是使程序正常工作的代码。 (并且不释放内存是一个错误)。
+1:最重要的要考虑的是,内存管理就如Yacoby所正确指出的那样:"操作系统的功能"。除非我没有记错,否则编程语言不会定义在程序执行之前或之后发生的事情。
轶事证据说明为什么显式释放可能是不好的:我写了一个命令行实用程序,它建立了一个巨大的链表;在退出时释放节点会延迟程序终止几秒钟(!),而如果不这样做,则OS会大量回收内存...
@Christoph我觉得操作系统如此之快地释放大型链表很奇怪,因为列表所占用的内存不会像大型阵列那样对齐,因此这似乎会导致性能问题。为什么不是这样?
支持虚拟内存的操作系统不会遇到显式释放内存的麻烦。它是虚拟的,只是不再存在。
D.Shawley:编程语言也没有定义系统调用或文件系统。仅使用编程语言规范定义的内容的程序是完全可移植的&