程序结束时释放块没有意义吗?

时间:2011-06-14 16:40:19

标签: c malloc free

  

可能重复:
  Is freeing allocated memory needed when exiting a program in C

我正在阅读"Freeing Memory Allocated with malloc"页面,然后遇到了这句话:

  

在程序结束时释放块是没有意义的,因为当进程终止时,所有程序的空间都会返回给系统。

我意识到作者试图说的是什么,但句子不应该是:

  

在程序结束时释放块是没有意义的,因为当进程终止时,所有程序的空间都会被返回给系统,虽然你仍然应该确保你编程释放所有malloc'ed退出前的记忆

或者通常的做法是在流程终止之前不取消分配内存?

6 个答案:

答案 0 :(得分:36)

我为此付出了很多热,但我的立场是,在程序退出之前努力释放内存应 Considered Harmful 。一方面,它是维护和调试的额外代码 - 但可能不是太多,所以这只是一个小问题。更大的问题是实际效果。

假设您有一个长期存在的程序,它分配了复杂/深层次的数据结构 - 作为一个很好的例子,想一想Web浏览器。这些数据很可能在一段时间内没有被使用,而且它已被交换到磁盘。如果你只是exit,那么磁盘上的换出数据就会被标记为未使用,再也不会被触及。但如果您浏览所有程序的数据结构以释放它们,您将触摸每个换出的页面,从而导致:

  • 磁盘访问以读取换出的数据
  • 从内存中驱逐其他程序的实际重要数据
  • 和相应的磁盘访问权以交换属于其他程序的所述数据。

所有这些浪费:

  • 用户的时间
  • 戴在硬盘上(或者更糟糕的是,在SSD /闪存上)

如果您使用足够膨胀的桌面应用程序(Firefox,OpenOffice,GIMP等或Windows等效项)使系统过载以使其交换,然后尝试关闭其中一个,则可以轻松地观察到此行为。您将花费几秒钟(甚至可能甚至约30秒,交换已经足够糟糕)等待它退出。如果程序刚刚直接调用exit(在检查未保存的文档之后),它将立即关闭。

答案 1 :(得分:5)

(这是一个非常主观的答案,所以请按照你的意愿。)

我认为这是一个很好的做法,以防你最终添加到这个过程,在这种情况下你可能想要释放内存。

我认为只要你需要动态内存,然后释放动态内存总是好的。我通常喜欢在写free之后立即在我的代码中编写malloc,然后在其间插入我需要的任何代码。

答案 2 :(得分:3)

我个人的偏好是在程序结束时释放内存 - 代码没有任何用处,但如果错误完成,仍然会有/导致错误。

同时,保留分配的内存将触发几乎所有自动检漏仪的报告,所以如果你正在使用一个(或永远可能),通常最好释放内存以防止真正的泄漏丢失/忽略。鉴于它们今天盛行,要确保你永远不会使用这样的东西是困难的(如果可能的话)。

答案 3 :(得分:2)

退出一个程序而不释放它的记忆是非常普遍的做法。

这是一个最好的做法肯定是讨论 - 通常一个程序中的main()演变为另一个更大的程序中的函数调用,当发生这种情况时,你希望你直接得到你的记忆(de)分配。然后,对于小型程序,它可能只是一个hazzle和额外不需要的工作。

答案 4 :(得分:2)

在程序结束时释放内存的最佳理由是找到泄漏。至少有些剖析器,如净化,会声称在程序结束前没有释放时,所有内容都会泄露。现在,你知道在内存被释放到操作系统的意义上它并不重要,但是它更难以判断你是否确实想要释放某些内容但却意外没有。这对于长时间运行的进程很重要,例如服务器进程,守护进程等,其中内存泄漏可能导致重大问题。对于那些完成工作然后立即退出的简单程序,如果你明确自由,我认为这并不重要。

答案 5 :(得分:2)

有些东西我非常努力明确地释放。例如,线程间通信对象池。我希望操作系统释放这些'因为它总是会在释放进程内存之前停止所有线程(可能仍然写入对象的线程)。

如果我不这样做,我会遇到尝试终止阻塞调用或运行循环的线程的所有问题。不能为所有那些麻烦烦恼:)

RGDS, 马丁