代码之家  ›  专栏  ›  技术社区  ›  Matt

在atexit()中释放

  •  11
  • Matt  · 技术社区  · 17 年前

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

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

    8 回复  |  直到 17 年前
        1
  •  22
  •   Sherm Pendley    17 年前

    不是在C中-这就像当船在你周围下沉时重新安排甲板椅。

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

        2
  •  15
  •   Rob Walker    17 年前

        3
  •  14
  •   Artelius    17 年前

    视为 malloc() / free() 免费的 在程序结束时占用内存实际上可能是性能消耗。如果数据结构的某些部分被分页到磁盘,则需要从磁盘加载这些数据结构,但这些数据结构将被丢弃!

    鉴于如果你终止合同而没有 免费的

    当然 malloc() s可以重新使用您释放的空间,并且 免费的 甚至可能取消映射一些内存,这些内存随后可供其他进程使用。

        4
  •  13
  •   JesperE    17 年前

        5
  •  6
  •   BenMorel Manish Pradhan    12 年前

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

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

        6
  •  5
  •   Adam Mitz    17 年前

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

        7
  •  2
  •   Ferruccio    17 年前

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

        8
  •  1
  •   Dustin Getz sunsations    17 年前

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

    推荐文章