c-在程序结束时释放块是没有意义的



可能重复:
退出C 中的程序时是否需要释放已分配的内存

我正在阅读"释放分配给malloc的内存"页面,无意中发现了这句话:

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

我知道作者想说什么,但这句话不应该是:

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

还是在进程终止之前不取消分配内存是常见的做法?

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

假设您有一个长期使用的程序,它分配了复杂/深层的数据结构——举个好例子,想想web浏览器。很可能这些数据中的大部分已经有一段时间没有使用了,而且已经交换到磁盘上了。如果您只是exit,那么磁盘上交换的数据只会被标记为未使用,并且永远不会再被触摸。但是,如果你浏览程序的所有数据结构以释放它们,你会触摸每个交换的页面,导致:

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

所有这些废物:

  • 用户的时间
  • 硬盘上的磨损(甚至更糟的是,在SSD/闪存上)

如果你的系统过载了足够多的臃肿的桌面应用程序(Firefox、OpenOffice、GIMP等或Windows等效程序)来进行交换,然后尝试关闭其中一个,那么这种行为很容易观察到。你会花几秒钟(甚至可能是30秒,因为交换已经够糟糕的了)等待它退出。如果程序刚刚直接调用exit(在检查了未保存的文档等之后),它会立即关闭。

(这是一个非常主观的答案,所以你可以随心所欲。)

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

我认为只在需要的时候保留动态内存,然后释放它总是很好的。我通常喜欢在写完malloc之后立即在代码中写free,然后在两者之间放上我需要的任何代码。

我个人的偏好是在程序结束时而不是释放内存——代码没有任何用处,但如果做得不正确,仍然可能有/导致错误。

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

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

这是否是一种最佳实践当然还有待讨论——一个程序中的main()经常演变成另一个更大程序中的函数调用,当这种情况发生时,你希望你的内存(de)分配正确。再说一遍,对于小程序来说,这可能只是一个难题和额外的不必要的工作。

在程序结束时释放内存的最佳原因是查找泄漏。至少有些评测程序,比如purify,会声称当你在程序结束前没有释放时,一切都被泄露了。现在,你知道,从内存被释放到操作系统的意义上来说,这并不重要,但这会让你更难判断是否有你真的打算释放但意外没有释放的东西。这对于长时间运行的进程非常重要,比如服务器进程、守护进程等,因为内存泄漏可能会导致重大问题。对于完成一项工作然后立即退出的简单程序,我真的认为如果你明确地释放它并不重要。

有些东西我非常努力而不是来显式释放。例如,线程间通信对象池。我希望操作系统释放这些线程,因为它总是在释放进程内存之前首先停止我的所有线程(那些可能仍在向对象写入的线程)。

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

Rgds,Martin

相关内容

  • 没有找到相关文章

最新更新