在atexit()函数中释放内存是否有任何意义?

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

整洁和积极清理它有什么好处吗?

有帮助吗?

解决方案

不在C中 - 就像船在您周围沉没时重新安排躺椅一样。

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

其他提示

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

看作 malloc() / free()通常涉及用户空间中存在的大量数据结构, free()内存时程序结束实际上可能是一个性能消耗。如果数据结构的某些部分被分页到磁盘,则需要从磁盘加载它们才能被丢弃!

如果您在没有 free()的情况下终止,那么分页到磁盘的数据可能会平静下来。

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

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

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

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

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

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

在Windows上,某些调用返回属于操作系统或COM的内存,您需要显式释放该内存,或者即使在您的进程终止后也不会释放它。但这是一种罕见的情况。

在进程终止之前不释放内存不是内存泄漏。丢失手柄时会出现内存泄漏。但是内存不是唯一的资源类型,其他资源在进程中保持不变(如窗口句柄和文件句柄),所以你需要“释放”那些资源。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top