释放atexit()

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

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

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

不在C中 – 这就像重新安排躺椅,而船在你周围沉没。

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

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

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

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

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

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

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

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

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

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

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

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