释放atexit()

时间:2008-10-23 19:24:10

标签: c memory free atexit

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

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

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

8 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:14)

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

答案 2 :(得分:12)

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

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

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

答案 3 :(得分:10)

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

答案 4 :(得分:6)

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

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

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

答案 5 :(得分:5)

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

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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