【问题标题】:Linux and memory leaksLinux 和内存泄漏
【发布时间】:2011-04-03 16:14:14
【问题描述】:

Linux 是否会立即自动回收应用程序使用的所有内存?

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

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

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

【问题讨论】:

    标签: linux memory-leaks


    【解决方案1】:

    Linux 是否会立即自动回收应用程序使用的所有内存?

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

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

    是的,有几个原因:

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

    当你想要不释放内存时,可能会出现一些情况,通常这些情况与性能相关,并且仅针对这些情况。

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

    这与上一个问题几乎相同。另请注意,不从第三方和操作系统库释放资源实际上与不释放内存相同。

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

    是的。这个理论唯一一次失效是当资源是全局的,并且不会在进程终止时消失。共享内存、设计不佳的第三方库、临时文件等就是这些例子。

    【讨论】:

    • @Hasturkun:谢谢我以前从未引用过
    【解决方案2】:

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

    如果他们做其他事情,例如刷新磁盘文件,其中可能包含未写入的数据,那么这可能很重要。

    顺便说一下,我是 _exit() 库调用的忠实拥护者 - 它就像 exit() 但 atexit 处理程序没有运行。

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

    当然还有其他泄漏资源的方式 - 不仅仅是内存。临时文件很明显 - 在您调用 _exit 后会一直存在。

    此外,如果您创建 posix 或 sysv 共享内存,它会在进程退出时保持存在。这真的很像一个临时文件(在 Linux 下它是作为一个在内核中的 tmpfs 上实现的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2013-01-25
      • 2011-08-20
      • 2023-03-21
      • 2010-12-02
      相关资源
      最近更新 更多