在atexit()函数中释放内存有意义吗?
我有一个全局变量,在启动后进行了malloc分配。我可以编写一个atexit()函数来释放它,但是程序退出时系统不会收回所有那些内存吗?
主动清理自己是否有益处?
在C语言中没有这样的操作-这就像是在船下沉时重新排列甲板上的椅子。
而在C++中情况不同,因为对象可以在它们的析构函数中删除临时文件等内容,所以你需要确保这些析构函数被调用。
释放它的一个好处是,如果你进行任何内存泄漏测试,试图在进程生命周期内匹配分配和释放,你就不会从这种故意泄漏中得到误报。
由于malloc()
/free()
通常涉及存在于用户空间中的大量数据结构,因此在程序结束时free()
内存实际上可能会影响性能。如果数据结构的某些部分被分页到磁盘上,则需要从磁盘加载它们,然后才能将其丢弃!
而如果不使用free()
终止程序,则分页到磁盘上的数据可以安心地死去。
当然,在其他时间使用free()
通常是有益的,因为进一步的malloc()
可以重用您释放的空间,free()
甚至可以取消映射一些内存,这些内存随后可以被其他进程使用。
如果你的代码调用了atexit(),而且这部分代码是作为动态加载的共享库(例如使用dlopen())的一部分,则应该使用free()。在这种情况下,atexit处理程序将在dlclose()时调用,因此堆将继续存在,以供进程的其余部分使用。
在进程终止之前不释放内存并不是内存泄漏。只有当你失去对它的控制时才会出现内存泄漏。但是内存并不是唯一的资源类型,其他资源会跨进程持久存在(例如窗口句柄和文件句柄),因此您确实需要“释放”这些资源。