在 atexit() 中释放

Posted

技术标签:

【中文标题】在 atexit() 中释放【英文标题】:Freeing in an atexit() 【发布时间】:2010-09-18 20:49:22 【问题描述】:

在 atexit() 函数中释放内存有什么意义吗?

我有一个全局变量,在启动后会被 malloc'ed。我可以写一个 atexit() 函数来释放它,但是当程序退出时系统不会回收所有内存吗?

自己整理并积极清理有什么好处吗?

【问题讨论】:

听起来像个骗子,见***.com/questions/2213627/…。 【参考方案1】:

在所有现代操作系统中,您可以放心地假设所有内存将在程序退出时被释放。

【讨论】:

+1 指出这是操作系统的功能,而不是语言。【参考方案2】:

释放它的一个好处是,如果您曾经做过任何内存泄漏测试,试图在进程的生命周期内将分配与解除分配相匹配,您将不会从这种故意泄漏中得到误报。

【讨论】:

Purify 用于在调用 atexit() 清理之前进行内存泄漏测试。这很烦人。但这也是十年前的事了——从那时起它可能已经改变了。【参考方案3】:

不是在 C 中 - 这就像在船沉没在你周围时重新布置躺椅。

在 C++ 中答案是不同的,因为对象可以在其析构函数中删除临时文件等,因此您需要确保调用这些文件。

【讨论】:

【参考方案4】:

在 Windows 上,某些调用返回属于操作系统或 COM 的内存,您需要明确释放该内存,否则即使在您的进程终止后也不会释放该内存。但这种情况很少见。

【讨论】:

【参考方案5】:

如果调用 atexit() 的代码是动态加载的共享库的一部分(例如,使用 dlopen()),则应该使用 free()。在这种情况下,将在 dlclose() 时调用 atexit 处理程序,因此堆将继续存在以供进程的其余部分使用。

【讨论】:

【参考方案6】:

malloc()/free()视为用户空间中存在的大量数据结构,free()在程序结束时占用内存实际上可能会消耗性能。如果部分数据结构被分页到磁盘,它们只需要从磁盘加载就被丢弃了!

而如果您在没有free()ing 的情况下终止,则分页到磁盘的数据可以安然死去。

当然free()在其他时候通常是有益的,因为进一步的malloc()s 可以重新使用您释放的空间,free() 甚至可能取消映射一些内存,然后可以由其他进程使用。

【讨论】:

【参考方案7】:

在进程终止之前不释放内存不是内存泄漏。当你失去它的句柄时,这是一个内存泄漏。但内存不是唯一的资源类型,其他资源会跨进程持续存在(如窗口句柄和文件句柄),因此您确实需要“释放”这些资源。

【讨论】:

【参考方案8】:

实际上,当您的程序发展时,整洁会很有趣。它会迫使您在创建“初始化”函数时编写清理函数。当您的程序变得更复杂并且您想要重新启动程序的一部分时,好处就来了。如果您已经编写了有效的清理函数,那么在“重新启动”程序的一部分时,您就不太可能突然忘记一些清理工作。

“懒惰地”编写清理函数,即仅在需要时更容易出错。编写清理函数迫使您考虑清理和最终的清理依赖。它允许在另一个项目中更轻松地重用您的部分代码。

所以是的,在 atexit 中释放是没有用的,关闭文件描述符也是如此。然而,随着代码的增长编写和维护清理功能可能是一个约束,会迫使你思考你在做什么

【讨论】:

以上是关于在 atexit() 中释放的主要内容,如果未能解决你的问题,请参考以下文章

是否可以更改使用 atexit() 注册的函数中的退出代码?

为啥 atexit 不在 python 中注册?

Linux中相关知识(atexit(),fork(),粘滞位)

C++学习(四零五)编译选项use-cxa-atexit no-use-cxa-atexit

atexit()函数

Atexit没有在python中注册