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

Sam*_*rsa 3 c malloc free

可能重复:
在C中退出程序时释放所需的内存

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

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

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

在程序结束时释放块是没有意义的,因为当进程终止时,所有程序的空间都会返回给系统,尽管你仍然应该确保程序在退出之前释放所有malloc的内存.

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

R..*_*R.. 36

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

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

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

所有这些浪费:

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

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

  • 事实上,我正在检查因为我在一天结束时关闭,这意味着我几乎不得不给出这个+1 - 关机操作的性能是值得考虑的. (4认同)
  • 顺便说一句,多线程程序中的另一个考虑因素是在程序关闭时正确释放所有内存可能需要非平凡的同步.如果你弄错了并释放了一些内存,你的清理例程的另一部分后来试图访问,你将调用未定义的行为.最好的程序会崩溃,但更糟糕的事情可能发生,无论哪种方式都是糟糕的用户体验.因此,简单的退出可以为您节省大量难以调试的程序逻辑. (3认同)

Pla*_*ure 5

(这是一个非常主观的答案,所以请随便怎么做。)

我认为这是个好习惯,以防您最终添加到流程中,在这种情况下,您可能最终想释放内存。

我认为最好只在需要时才保存动态内存,然后释放它。我通常喜欢在编写free之后立即编写代码malloc,然后将所需的任何代码放在两者之间。

  • 对于短暂的分配,这绝对是正确的-完成操作后,应立即释放它们。但是,如果您知道某些内存中保存有数据,那么在程序终止之前您将无法对其进行“处理”,因此释放它毫无意义。 (2认同)