当前位置:  开发笔记 > 程序员 > 正文

释放atexit()

如何解决《释放atexit()》经验,为你挑选了6个好方法。

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

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

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



1> Sherm Pendle..:

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

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



2> Rob Walker..:

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



3> Artelius..:

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

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

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



4> JesperE..:

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


+1表示这是操作系统的一个功能,而不是语言.

5> shodanex..:

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

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

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



6> Adam Mitz..:

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

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有