在atexit()函数中释放内存有什么意义吗?
我有一个全局变量,在启动后获得malloc.我可以编写一个atexit()函数来释放它,但是当程序退出时系统是否会回收所有内存?
整洁和积极清理自己有什么好处吗?
不在C中 - 就像船在您周围沉没时重新安排躺椅一样.
在C++中,答案是不同的,因为对象可以在析构函数中删除临时文件等,因此您需要确保调用它们.
释放它的一个好处是,如果你曾经做过任何内存泄漏测试,试图在过程的整个生命周期中将分配与解除分配相匹配,那么你就不会从这种故意泄漏中得到误报.
看作malloc()
/ free()
通常涉及用户空间中存在的大量数据结构,free()
当程序结束时内存实际上可能是性能消耗.如果数据结构的某些部分被分页到磁盘,则需要从磁盘加载它们才能被丢弃!
然而,如果您在没有free()
ing的情况下终止,那么分页到磁盘的数据可能会平静下来.
当然,free()
在其他时候通常是有益的,因为进一步的malloc()
s可以重新使用你释放的空间,free()
甚至可以取消映射一些可以被其他进程使用的内存.
在所有现代操作系统中,您可以安全地假设程序退出时将释放所有内存.
实际上,当你的程序发展时,整洁可能会很有趣.当你创建"初始化"函数时,它会强制你编写清理函数.当程序变得更复杂,并且您想重新启动部分程序时,会带来好处.如果您已经编写了工作清理功能,那么在"重新启动"程序的一部分时,您不太可能突然忘记清理.
编写清理函数"懒惰",即只在您需要它时更容易出错.编写清理函数会强制您考虑清理和最终清理依赖性.它允许在另一个项目中更轻松地重用代码的一部分代码.
所以,在atexit中释放是没用的,关闭文件描述符也是如此.但是,随着代码的增长,编写和维护清理功能可能会成为一种约束,会迫使您思考自己在做什么
如果调用atexit()的代码是动态加载的共享库(例如,使用dlopen())的一部分,则应该free().在这种情况下,将在dlclose()时调用atexit处理程序,以便堆继续存在以供进程的其余部分使用.