Linux和内存泄漏

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

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

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

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

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

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

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

是的,有几个原因:

  • 您可能决定将代码扩展到未来的其他目的,稍后增加清理可能会很困难。
  • 你有过多的内存使用,实际上需要虚拟内存空间被“浪费”。
  • 你需要找出一些错误:不小心释放获得的资源会使调试变得非常困难。

在没有释放记忆的情况下,可能会出现这种情况,一般情况下这些都是与性能有关的,而且只针对这些情况。

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

这和上一个问题几乎一样。 另外请注意,不释放来自第三方的资源,而OS库与释放内存的效果是一样的。

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

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

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

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

我非常喜欢_exit()库调用的方式 – 它就像exit(),但是atexit处理程序不运行。

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

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

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