【问题标题】:Freeing in an atexit()在 atexit() 中释放
【发布时间】:2010-09-18 20:49:22
【问题描述】:

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

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

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

【问题讨论】:

标签: c memory free atexit


【解决方案1】:

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

【讨论】:

  • +1 指出这是操作系统的功能,而不是语言。
【解决方案2】:

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

【讨论】:

  • Purify 用于在调用 atexit() 清理之前进行内存泄漏测试。这很烦人。但这也是十年前的事了——从那时起它可能已经改变了。
【解决方案3】:

不是在 C 中 - 这就像在船沉没在你周围时重新布置躺椅。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        将malloc()/free()视为用户空间中存在的大量数据结构,free()在程序结束时占用内存实际上可能会消耗性能。如果部分数据结构被分页到磁盘,它们只需要从磁盘加载就被丢弃了!

        而如果您在没有free()ing 的情况下终止,则分页到磁盘的数据可以安然死去。

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

        【讨论】:

          【解决方案7】:

          在进程终止之前不释放内存不是内存泄漏。当你失去它的句柄时,这是一个内存泄漏。但内存不是唯一的资源类型,其他资源会跨进程持续存在(如窗口句柄和文件句柄),因此您确实需要“释放”这些资源。

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-27
              • 2010-12-13
              • 2011-11-09
              • 1970-01-01
              • 2019-01-12
              • 2011-01-08
              • 2011-12-22
              相关资源
              最近更新 更多