【问题标题】:to clean up on exit or not [duplicate]在退出时清理或不清理[重复]
【发布时间】:2015-02-05 11:08:41
【问题描述】:

我知道清理是一件好事。我也了解操作系统内部,所以如果我知道我的进程正在终止,那么它的内存将被释放。但我喜欢提出不同的观点。我在线上,在退出时释放内存是相当糟糕的主意。

例如我可能分配了当前已换出的大内存,如果我在退出时将其释放,则需要将其带到 RAM 中,然后释放它。如果我不这样做,退出时它只会在一张表中被标记为空闲。

总体而言,操作系统发生了很大变化(基本保持不变),我理解这个问题可以被认为是 A_VERY_PLATFORM_DEPENDENT,但从今天的应用程序开发人员的角度来看,他要么陷入(?)某些框架,要么是胆大妄为正在研究 COM 等原始技术的 coder 非常依赖,我称之为 VERY_CONTROLLED_ENVIRONMENT。

对于TL;DR:在现代操作系统上,我认为我不应该在退出时执行清理。如果你认为我错了,为什么?

PS:我不是在谈论 RTOS,我的意思是受控环境是指 Windows、Linux,我从来没有指设备驱动程序开发或操作系统开发。

【问题讨论】:

  • 我怀疑应用程序 free 和 SO free 之间存在差异(关于需要将页面从 SWAP 带入 RAM)
  • 这是几周前讨论过的。我会找到并标记这个副本。
  • 非内存资源如文件句柄、内核句柄等呢?如果你不清理基于内存的资源,你怎么能确定它们没有持有“外部”句柄?
  • 我想说 cleanup 应该更多地从资源角度来看,例如db 服务器会话、独占本地文件锁等,而不仅仅是 释放 内存(当然,任何合理的操作系统都应该从退出的进程中重新获得内存)。
  • 试图在用户代码中复制操作系统功能,在没有充分理由的情况下,只是愚蠢的。要无故障关闭应用程序,必须在释放内存等资源之前停止所有线程。操作系统可以轻松做到这一点。用户代码不能总是这样做,(例如,它不能安全地直接停止在另一个内核上运行的线程,而不是请求终止的线程),即使可以,它也是额外的代码、测试和调试来复制已经存在的功能和已经过测试。如果没有不良后果,就终止。东西 valgrind。

标签: c++ operating-system resource-cleanup application-layer


【解决方案1】:

已换出的内存块只有在您访问它们时才会被带入。释放一个块是一个“簿记”事件,它不需要内存访问。跳过释放内存的调用不会有任何收获。

总是在退出时手动释放资源的理由要强大得多:它允许您使用工具进行内存分析,因为您可以区分意外泄漏和故意泄漏。仅凭这个理由就足以建议不要跳过内存清理。

【讨论】:

  • '仅凭这个理由就足以建议不要跳过内存清理'。嗯,不。这是优势之一。这不是一个压倒一切的问题。
  • @MartinJames 我是说这个理由本身就足够了。可能还有其他充分的理由(例如,当您的代码在生产中运行关键操作时能够在晚上睡个好觉)每个理由都足够强大。就个人而言,我发现在不运行内存分析器并修复它报告的所有警告的情况下将 C++ 代码发布到生产环境中风险太大。
猜你喜欢
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多