【发布时间】:2011-04-03 16:14:14
【问题描述】:
Linux 是否会立即自动回收应用程序使用的所有内存?
如果是这样,那么应用程序真的应该在退出前释放所有内存吗?
在调用 exit(0) 之前调用多线程应用程序中每个类的析构函数真的值得吗?
如果 Linux 总是立即重新声明应用程序使用的所有内存,那么内存泄漏只是应用程序创建的悬空指针,也只是它的生命周期。
【问题讨论】:
标签: linux memory-leaks
Linux 是否会立即自动回收应用程序使用的所有内存?
如果是这样,那么应用程序真的应该在退出前释放所有内存吗?
在调用 exit(0) 之前调用多线程应用程序中每个类的析构函数真的值得吗?
如果 Linux 总是立即重新声明应用程序使用的所有内存,那么内存泄漏只是应用程序创建的悬空指针,也只是它的生命周期。
【问题讨论】:
标签: linux memory-leaks
Linux 是否会立即自动回收应用程序使用的所有内存?
不,但在你暗示的意义上是的。属于该进程的所有虚拟内存都被释放。未共享的帧可供其他进程使用。
如果是这样,那么应用程序真的应该在退出前释放所有内存吗?
是的,有几个原因:
当你想要不释放内存时,可能会出现一些情况,通常这些情况与性能相关,并且仅针对这些情况。
在调用 exit(0) 之前调用多线程应用程序中每个类的析构函数真的值得吗?
这与上一个问题几乎相同。另请注意,不从第三方和操作系统库释放资源实际上与不释放内存相同。
如果 Linux 总是立即重新声明应用程序使用的所有内存,那么内存泄漏只是应用程序创建的悬空指针,也只是它的生命周期。
是的。这个理论唯一一次失效是当资源是全局的,并且不会在进程终止时消失。共享内存、设计不佳的第三方库、临时文件等就是这些例子。
【讨论】:
这真的取决于那些构造函数做什么。如果他们所做的只是释放私有内存,那么你不需要。
如果他们做其他事情,例如刷新磁盘文件,其中可能包含未写入的数据,那么这可能很重要。
顺便说一下,我是 _exit() 库调用的忠实拥护者 - 它就像 exit() 但 atexit 处理程序没有运行。
健壮的应用程序应该能够容忍随时消失,因此退出的有效方法是 _exit(),因为它仍然比崩溃更受控制。
当然还有其他泄漏资源的方式 - 不仅仅是内存。临时文件很明显 - 在您调用 _exit 后会一直存在。
此外,如果您创建 posix 或 sysv 共享内存,它会在进程退出时保持存在。这真的很像一个临时文件(在 Linux 下它是作为一个在内核中的 tmpfs 上实现的)
【讨论】: