在 C 中退出程序时释放所需的分配内存
Posted
技术标签:
【中文标题】在 C 中退出程序时释放所需的分配内存【英文标题】:Is freeing allocated memory needed when exiting a program in C 【发布时间】:2011-08-02 11:54:52 【问题描述】:如果我在我的 C 程序中使用 malloc
分配了内存,现在我想退出,我是否必须释放分配的内存,或者我可以假设由于我的整个程序终止,它将被操作系统释放?
我在 Linux 环境下运行。
【问题讨论】:
我出于纯粹的好奇和更好地理解内存分配和 OP 的工作原理,向所有相关回答者(回答者)保证,我将始终释放我分配的内存。 What REALLY happens when you don't free after malloc? 的可能重复项 【参考方案1】:任何现代操作系统都会在进程终止后清理所有内容,但依赖此操作通常不是一个好习惯。
这取决于您正在编写的程序。如果它只是一个快速运行和终止的命令行工具,您可能不会费心清理。但请注意,正是这种心态会导致守护进程和长时间运行的程序出现内存泄漏。
【讨论】:
我完全明白你的意思,但我不同意“当我的进程退出时不清理内存”的心态会导致长时间运行的程序泄漏。不管它运行多长时间,操作系统都会在退出时清理它。 “懒于清理”肯定会导致内存泄漏,但这不是问题所在。不释放内存的决定应该是有意识和深思熟虑的。【参考方案2】:简单地退出并允许操作系统清理所有内容可能是一个很好的设计并且非常有效。 Apple OS X now does this by default: 除非应用程序设置了“不要杀我”标志,否则应用程序会在没有通知的情况下被终止。
通常,释放每个内存分配需要大量时间。一些内存页面可能已被换出,必须重新读入,以便将它们标记为空闲。内存分配器必须做很多工作来更新空闲内存跟踪数据。所有这些努力都是浪费,因为程序正在退出。
但这必须通过设计完成,而不是因为程序员忘记了分配的内存!
【讨论】:
赞成你的最后一句话,这是最重要的一点。【参考方案3】:在任何情况下,它都会在进程终止时被操作系统释放。所以你不需要它,但既然这是一个很好的做法,你为什么不这样做呢? :)
实际上,对于复杂的代码,我不会冒险不发布我不确定 100% 无用的东西,因为程序随后会退出。因此,对于任何最小的疑问,只需释放它。
【讨论】:
【参考方案4】:是的,你可以假设。
尽管在不需要内存后立即释放内存是一种很好的做法,即使对于只运行很短时间的软件也是如此。
【讨论】:
【参考方案5】:操作系统将回收内存,因此您无需释放它。
尽管大多数程序都会释放内存,因为如果您不释放任何内存,那么您很可能会遇到由这些故意泄漏引起的问题。
【讨论】:
反对票来自我。但我可以发誓,当我这样做的时候,只有第一句话。我现在将它与添加的句子一起收回,但它以某种方式被锁定,除非它再次被编辑或其他任何含义。任何建议都赞赏如何在更改后立即删除反对票。出于同样的原因,对这个主题的第二个(现已删除)答案投了反对票,顺便说一句。 @status 如果您愿意,您现在可以更改您的投票。第一句话有什么问题?这是真的你不知道吗?! 谢谢。完毕。对于大多数操作系统来说都是如此,是的。但它不认为编写的代码可以在释放 至关重要的其他地方重用(想想库)。这就是为什么最好的做法是释放任何东西,即使操作系统在进程终止时默认收集内存。 @status 问题是关于在 linux 上终止的进程。为了它的价值,我总是释放我的记忆,但我知道如果我不这样做,我的应用程序会更快关闭! 您能否详细说明“这些故意泄漏造成的问题”?假设泄漏仅在退出时发生,这可能会导致什么问题?【参考方案6】:Linux 将释放分配的内存并在进程终止时关闭文件描述符。
【讨论】:
【参考方案7】:始终释放您分配的内存,因为操作系统会无缘无故地占用更少的内存。这在内存较小的小型操作系统中非常明显。
【讨论】:
这是一个糟糕的答案,没有解决实际问题,即退出 Linux 进程时是否释放内存。它由操作系统释放,并在毫无意义地退出之前显式释放所有内存会减慢程序并使程序复杂化。【参考方案8】:操作系统将回收内存,但是如果您希望在 malloc 其他内容之前它们会超出范围,则最好释放它们。但是,您可以或多或少依赖程序的终止来为您处理内存管理。
【讨论】:
以上是关于在 C 中退出程序时释放所需的分配内存的主要内容,如果未能解决你的问题,请参考以下文章
如果程序因错误而提前退出,那么释放动态分配的内存的正确方法是啥?