OS;资源自动清理

时间:2009-06-29 19:53:12

标签: resources operating-system

从这个回答:When is a C++ terminate handler the Right Thing(TM)?

当应用程序退出时,操作系统会自动清除“是”和“不”的资源列表会很不错。在您的回答中,如果您可以指定操作系统/资源并且最好是指向某个文档(如果适用)的链接,那将是很好的。

显而易见的一个:

内存:是自动清理。 题。有没有例外?

4 个答案:

答案 0 :(得分:5)

当应用程序在没有明确释放的情况下崩溃或退出时,Windows无法清理一些模糊的资源,主要是因为操作系统不知道它们是否重要而不会离开。

  1. 临时文件 - 正如其他人所说。
  2. 全局注册WNDCLASS es(“当卸载DLL时,DLL注册的窗口类没有注册。一个DLL在卸载时必须显式取消注册它。”MSDN)如果你的全局window类也有DC类,那么DC也会泄漏。
  3. 全球ATOM(资源相对有限)。
  4. 使用RegisterWindowMessage创建的窗口消息ID。这些是为了泄漏而设计的,因为没有UnregisterWindowMessage
  5. 信号量和事件在技术上没有泄漏,但是当拥有的应用程序在没有发出信号的情况下消失时,其他进程就会挂起。对于互斥锁而言,情况并非如此。如果拥有的应用程序消失,则会释放等待该Mutex的其他进程。
  6. 如果在退出之前未取消注册hot key,Windows XP及更早版本可能会有一些遗留问题。其他应用程序可能无法注册相同的热键。
  7. 在Windows XP及更早版本中,在进程崩溃后生成僵尸控制台窗口的情况并不少见。 (具体来说,GUI应用程序也会创建一个控制台窗口。)它显示在任务栏上。您所能做的就是最小化,恢复或移动窗口。
  8. 在退出时未明确释放资源的应用可能会加剧Buggy驱动程序。非分页池泄漏很常见。
  9. 数据已复制到剪贴板。我想这并不重要,因为它在那时由操作系统拥有,而不是将它放在那里的应用程序。
  10. 安装过程在卸下挂钩之前崩溃时,不会卸载全局安装的挂钩。

答案 1 :(得分:3)

任何异常都是一个错误 - 应用程序可以并且确实崩溃并且确实包含泄漏。操作系统需要可靠,即使面对写得不好的应用程序也不会耗尽资源。这也适用于非OS资源。将资源分发给流程的服务需要在流程退出时释放这些资源。如果不是,那就是需要修复的错误。

如果你正在寻找可以在进程退出之后持续存在的程序工件,那么在Windows上你至少有:

  • 创建的注册表项 没有REG_OPTION_VOLATILE
  • 在没有FILE_FLAG_DELETE_ON_CLOSE
  • 的情况下创建的文件
  • 事件日志条目
  • 用于打印作业的纸张

答案 2 :(得分:3)

在Windows中,几乎任何可以处理的事情都应该由操作系统管理 - 这就是为什么你只能得到一个句柄。这包括但不限于汤姆 以下(从MSDN文档复制的CloseHandle()API列表):

Communications device 
Console input 
Console screen buffer 
Event 
File 
File mapping 
Job 
Mailslot 
Mutex 
Named pipe 
Process 
Semaphore 
Socket 
Thread 
Token 

当应用程序关闭时,操作系统应该恢复所有这些,但可能不会立即恢复,具体取决于其他进程的使用情况。

其他操作系统以相同的方式工作。很难想象一个名副其实的操作系统(我不包括嵌入式系统等),但事实并非如此 - 资源管理是操作系统的第一个存在理由。

答案 3 :(得分:3)

临时文件是被清除的一个很好的例子 - 句柄被释放但文件没有被删除