内存泄漏能走多远?(How far can memory leaks go?)

2019-07-21 20:29发布

我碰到的内存泄漏的许多倍。 通常,当我malloc -ing像有没有明天,或叼着FILE *就像脏衣服。 我一般假设(读:迫切希望)所有的内存清理程序终止至少当。 有没有在那里泄漏的内存不会被回收当程序终止,或崩溃任何情况呢?

如果答案从语言到语言差别很大,那么让我们专注于C(++)。

请注意这句话的双曲使用,就像没有明天“和“晃来晃去......像脏衣服”。 不安全* malloc * ING可以伤害你爱的人。 另外,请谨慎使用脏衣服。

Answer 1:

第操作系统,当他们退出释放由进程持有的所有资源。

这也适用于操作系统维护的所有资源:内存,打开的文件,网络连接,窗口句柄...

也就是说,如果该程序是嵌入式系统上运行没有操作系统,或使用非常简单的或者有缺陷的操作系统,内存可能无法使用,直到重新启动。 但如果你是在这种情况下,你可能就不会问这个问题。

操作系统可能需要很长的时间来释放某些资源。 例如,一个网络服务器用来接受连接的TCP端口可能需要几分钟,成为自由的,即使通过正常程序关闭。 联网程序还可以保存远程资源,比如数据库对象。 远程系统应该释放这些资源当网络连接丢失,但它可能甚至超过本地操作系统需要。



Answer 2:

C标准没有明确规定,通过分配的内存malloc程序终止时被释放。 这由操作系统完成,不是所有的操作系​​统(通常这些都是嵌入式世界)释放内存的程序终止时。



Answer 3:

由于所有的答案都涉及您的问题WRT现代操作系统的大部分内容,但在历史上,有一个如果你曾经在DOS下编程世界是值得一提。 Terminant并驻留 (TSR)程序通常将返回控制系统,但将驻留在内存中这可能是由软件/硬件中断恢复。 这是正常的,看到喜欢的消息“内存不足!尝试卸载一些你的TSR的”关于这些操作系统工作时。

因此从技术上讲程序终止 ,但由于它仍驻留在内存中,任何内存泄漏不会,除非你卸载程序释放。

所以,你可以认为这是由操作系统不回收内存是另一种情况下,除了可能是因为它的马车,或者因为嵌入式操作系统设计这样做。

我记得一个例子。 客户信息控制系统 (CICS),它运行主要在IBM大型机交易服务器是伪会话。 当执行时,其处理用户输入的数据,产生另一组数据对于用户来说,传送到所述用户终端节点,并结束。 在激活的关注重点,它再次复兴来处理另一组数据。 因为这样它的行为,在技术上再次,操作系统将不会回收从终止CICS程序内存,除非你回收CICS交易服务器。



Answer 4:

像其他人所说的,大多数操作系统将收回分配在终止进程(也可能是其他资源,如网络套接字,文件句柄等)内存。

话虽如此,内存可能不是你需要担心的新问题时的唯一的事情/删除(而不是原始的malloc /免费)。 这是一个在新分配的内存可能会被回收,但事情是可以以对象的析构函数来完成将不会发生。 也许有些类的析构函数写一个定点值到时破坏的文件。 如果进程刚刚结束,文件句柄可以得到刷新和内存回收,但哨兵值将不会被写入。

这个故事的寓意,总是照顾自己清理。 不要让事情吊着。 不要依赖OS之后,清理上。 后自己清理。



Answer 5:

这是更可能取决于操作系统不是语言。 最终,在任何语言的任何程序将获得它从操作系统的内存。

我从来没有听说过的操作系统的程序退出时不回收内存/崩溃。 所以,如果你的程序有一个上限,它需要分配内存,然后就分配和释放绝不是完全合理的。



Answer 6:

如果程序永远变成了动态组件(“插件”)被加载到另一个程序的地址空间,这将是麻烦的,即使在操作系统与整洁的内存管理。 我们甚至没有去想代码被移植到能力较差的系统。

在另一方面,释放所有的内存影响程序的清理性能。

一个节目我正在,某一测试所需的情况下30秒或更多的程序退出,因为它是通过递归所有动态存储器的曲线图,并通过一块释放它片。

一个合理的解决方案是有能力和有测试用例覆盖它,但在生产代码将其关闭,从而在应用程序退出快。



Answer 7:

所有的操作系​​统都值得标题将清理结束后你的过程搞得一团糟。 但总有一些不可预见的事件,如果它在某种程度上拒绝访问和一些贫困的程序员没有预见到的可能性,所以它不会有点稍后再试? 始终安全,只是清理自己,如果内存泄漏是关键任务 - 否则不值得努力IMO如果这一努力是昂贵的。

编辑:您确实需要清理内存泄漏,如果他们在的地方,他们会积累,像循环。 内存泄漏我说的是那些在固定时间内建立起整个程序的过程中,如果您有任何其他种类的泄漏,将最有可能成为一个严重的问题,迟早的事。

在技​​术方面,如果你的漏洞是记忆“复杂” O(1),他们在大多数情况下细,O(LOGN)已不愉快的(在某些情况下是致命的)和O(N)+不能容忍的。



Answer 8:

POSIX上兼容的系统共享存储器持续直到shm_unlink被称为或系统重新启动。



Answer 9:

如果有进程间通信,这可能会导致从未完成和消费取决于协议资源的其他过程。

举个例子,我曾经与印刷试验,以Java中的PDF打印机,当我在一台打印机作业过程中终止JVM中,PDF后台进程依然活跃,我只好之前,我可以杀死它在任务管理器重试打印。



文章来源: How far can memory leaks go?