2011-04-10 73 views
19

退出程序时,如果我使用malloc在我的C程序分配的内存,现在我要退出需要分配的内存,我必须释放分配的内存,或者我可以假设,因为我的整个程序终止,它将被操作系统释放?正在释放用C

我在Linux环境下运行。

+2

我问出来的纯粹的好奇心和理解内存分配和OP的工作更好,我保证所有有关应答者(那些谁回答),我会永远免费的我分配的内存。 – SIMEL 2011-04-10 13:59:42

+0

[当你在malloc之后不自由时会发生什么?](http:// stackoverflow。com/questions/654754/what-really-happen-when-you-dont-free-after-malloc) – Mark 2013-05-12 13:24:33

回答

19

任何现代操作系统都会在进程终止后清理所有的东西,但依赖于此通常不是一个好习惯。

这取决于你正在编写的程序。如果它只是一个快速运行和终止的命令行工具,那么您可能不会打扫清理。但请注意,正是这种思维模式导致了守护进程和长时间运行的程序中的内存泄漏。

+0

我完全明白你的观点,但我不同意“当我的进程退出时不清理内存”的思维方式会导致长时间运行的程序泄漏。不管它运行多长时间,OS都会在退出时清理它。 “懒惰清理”肯定会导致内存泄漏,但这不是问题。不释放记忆的决定应该是有意识的和谨慎的。 – Dan 2017-07-14 15:58:09

2

操作系统将回收内存,因此您无需将其释放。

大多数程序做免费的内存,但因为如果你不释放那么任何内存,你容易有由这些有意地泄漏问题。

+1

显然downvoter不同意! – 2011-04-10 13:47:01

+0

downvote是从我。但是我可以发誓,那时我只有第一句话。我现在将添加的句子拿回来,但除非再次进行编辑或其他方式,否则它会被锁定。任何建议都赞赏如何在更改后立即删除downvote。根据同样的原因,在这个主题下降了第二个(现在删除的)答案,顺便说一句。 – 0xC0000022L 2011-04-10 14:17:03

+0

@status如果你愿意,你现在可以改变你的投票。第一句话有什么问题?这是真的你不知道吗?! – 2011-04-10 14:24:38

3

在任何情况下,它都会在进程终止时被操作系统释放。所以你不需要它,但是因为这是一个很好的习惯,为什么你不这样做呢? :)其实有复杂的代码

我不会的风险不释放一些东西,我不知道在100%,因为程序退出后,将是无用的。所以对于任何最小的疑问,只要解放它。

2

是的,你可以假设。

虽然这是一个很好的做法,取消分配不需要后立即对它的记忆,即使对于只有很短的时间运行的软件。

0

OS将回收内存,但它是很好的做法,免费的东西,如果你希望他们会在你面前跑出来的范围malloc的东西。但是,您可以或多或少地依靠程序的终止来处理内存管理。

1

Linux将释放分配的内存并关闭进程终止时的文件描述符。

1

总是释放您分配的内存,因为操作系统将毫无理由地占用更少的内存。在小型操作系统中这一点非常引人注目,它的内存很小。

+0

这是一个糟糕的答案,它没有解决实际的问题,即关于从Linux进程退出时是否释放内存。它由操作系统释放,在退出之前明确地释放所有内存,毫无意义地减慢并使程序复杂化。 – 2011-04-12 08:57:49

8

它可以是一个很好的设计和非常高效的简单退出并允许操作系统清理一切。 Apple OS X now does this by default:除非应用程序设置了“不要杀我”标志,否则应用程序会在不通知的情况下被杀死。

通常情况下,释放每个内存分配需要花费大量时间。某些内存页面可能已被换出,并且必须重新读入,以便将它们标记为空闲。内存分配器必须做很多工作来更新空闲内存跟踪数据。所有这些努力都是浪费,因为该计划正在退出。

但是这必须通过设计来完成,而不是因为程序员失去了分配内存的轨道!

+0

Upvoted为您的最后一句话,这是最重要的一点。 – Dan 2017-07-14 15:59:15