C语言中使用malloc()分配的内存空间会在程序结束后被释放吗?

4
在我的第一门C语言课程中,老师告诉我,在动态分配内存后应该调用free()calloc()释放空间,否则该空间将会消失(我猜直到系统重新启动)。然而,最近我开始在各种编程网站上读到这个内存将在程序结束时释放回去的说法。哪一个是正确的陈述?我想查看官方规范,但我不知道在哪里获取(已尝试过谷歌搜索)。谢谢。

程序终止时,与该程序相关的所有内存都会被释放。(但如果你创建了僵尸进程,它们将会一直存在) - Chad
后者有时可能是真的,但前者是一个非常好的经验法则。 - user395760
@cHao:是的,可能还有很多其他的。这个问题经常被问到。 - Fred Larson
4个回答

3

非常简短的回答..

这两种说法都是正确的。


更加详细的回答..

当您的应用程序完全终止时,分配的内存将(可能)被释放回系统,因此这两种说法都是正确的。

我写了“可能”,因为所有现代/广泛使用的操作系统都会释放所使用的内存,但一些原始系统可能没有这个“功能”。

因此,您应该始终使用free来释放已分配但未使用的变量的内存,特别是在运行时(否则,您将拥有一个可能/将慢慢消耗所有可用内存的内存泄漏)。

如果您想要冒险而不在应用程序终止之前释放内存,那对于我和大多数人来说都没问题。但是,请确保您要运行应用程序的平台确实会在之后将内存释放回操作系统。


关于查看标准(“官方规范”)

标准通常/总是省略实现细节,因此其中没有任何内容说明在运行的应用程序终止时未被释放的分配内存会发生什么。

这是实现特定的,因此取决于您运行它的位置。


3
在任何有受保护内存的系统上(例如Windows 4.x+、Linux、Unix等),当程序终止时,该内存将被释放。
然而,在某些嵌入式系统中,这可能并非总是如此。
不管怎样,正确地释放所有内容肯定是一个好习惯。

1

这是在程序内有效的,也就是在进程运行时有效。

在程序外,这取决于操作系统。虽然没有规范,但大多数系统会在进程结束后清理其使用的所有内存。


0

在进程终止时,所有给定进程的内存都会释放回系统。然而,在程序退出之前,总是很重要地free()你的内存,尤其是对于长时间运行的程序来说。 对于短时间运行的程序来说,这仍然是个好习惯。 当valgrind输出一个干净的检查结果时,总是让人感到很好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接