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

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

我正在阅读“使用malloc分配的Freeing Memory”页面,并查看了这句话:

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

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

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

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

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

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

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

所有这些浪费:

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

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

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

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

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

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

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

在不释放内存的情况下退出程序是一种常见的做法。

无论是最佳实践还是讨论 – 通常一个程序中的main()通常演变为另一个更大程序中的函数调用,当发生这种情况时,您希望直接获得内存(de)分配。 然后,对于小型程序,它可能只是一个hazzle和额外不需要的工作。

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

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

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

Rgds,马丁