Linux和内存泄漏

时间:2010-08-25 11:17:14

标签: linux memory-leaks

Linux是否会立即自动重新声明应用程序使用的所有内存?

如果是这样,那么应用程序是否真的会在退出之前释放所有内存?

在调用exit(0)之前调用多线程应用程序中每个类的析构函数真的值得吗?

如果Linux总是立即重新声明应用程序使用的所有内存,那么内存泄漏只是应用程序创建的悬空指针,而且只是它的生命周期。

2 个答案:

答案 0 :(得分:6)

  

Linux是否会立即自动重新声明应用程序使用的所有内存?

不,但从你暗示的意义上来说是肯定的。属于该进程的所有虚拟内存都将被释放。未共享的帧可供其他进程使用。

  

如果是这样,那么应用程序是否真的要在退出之前释放所有内存?

是的,有几个原因:

  • 您可能决定将代码扩展到其他目的,以后添加清理可能会很困难。
  • 您的内存使用率过高,实际上需要将虚拟内存空间“浪费”。
  • 您需要追踪一些错误:不小心释放获得的资源会使调试变得非常困难。

在没有释放内存的情况下,有些情况可能会出现,通常这些情况与性能有关,并且只针对这些情况。

  

在调用exit(0)之前调用多线程应用程序中每个类的析构函数真的值得吗?

这与上一个问题几乎相同。另请注意,不从第三方释放资源,OS库实际上与不释放内存有效。

  

如果Linux总是立即重新声明应用程序使用的所有内存,那么内存泄漏只是应用程序创建的悬空指针,而且只是它的生命周期。

烨。这个理论破裂的唯一一次是资源持有是全球性的,并且不会在流程终止时消失。共享内存,设计不佳的第三方库,临时文件等都是这些例子。

答案 1 :(得分:2)

这取决于那些构造函数的作用。如果他们所做的只是释放私人记忆,那么你不需要。

如果他们做其他事情,例如可能有未写入数据的刷新光盘文件,那么它可能很重要。

顺便说一句,我非常喜欢_exit()库调用 - 就像exit()但是atexit处理程序没有运行。

强大的应用程序应该能够容忍随时消失,因此退出的有效方法是_exit(),因为它仍然比崩溃更有效。

当然还有其他泄漏资源的方法 - 它不仅仅是内存。临时文件是一个显而易见的文件 - 在调用_exit后它将保持存在。

此外,如果您创建posix或sysv共享内存,它会在进程退出时保持存在。这与临时文件非常类似(在Linux下,它在内核中的tmpfs上实现)