2010-08-25 51 views
1

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

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

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

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

回答

6

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

不,但是在你意味着的意义上。所有属于该进程的虚拟内存都被释放。不共享的帧可用于其他进程。

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

是的,有以下几个原因:

  • 您可以决定伸向其他用途的代码在未来,加入清理以后可能很难。
  • 您的内存使用量过高,实际上需要“浪费”虚拟内存空间。
  • 您需要找出一些错误:不谨慎释放获得的资源将会使调试变得非常困难。

当没有释放内存是您想要的时候可能会出现的情况,通常这些会与性能相关,并且只针对这些情况。

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

这与上一个问题非常相似。另请注意,不释放来自第三方的资源,操作系统库与释放内存的效果完全相同。

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

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

+1

此外,还有专业性。 – Joe 2010-08-25 12:45:48

+0

@Hasturkun:谢谢我从来没有引用过 – 2010-08-25 14:33:29

+0

@Joe:你是什么意思? – 2010-08-25 15:59:25

2

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

如果他们做了其他事情,比如可能没有写入数据的光盘文件,那么这可能很重要。

我非常喜欢_exit()库调用的大风扇 - 它就像exit()但atexit处理程序不运行。

强大的应用程序应该能够随时容忍消失,因此有效的退出方式是_exit(),因为它比受到更多的控制而不是崩溃。

当然还有其他泄漏资源的方式 - 这不仅仅是记忆。临时文件是一个明显的文件 - 在你调用_exit之后它将保持存在。

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