操作系统;资源自动清理

问题描述 投票:0回答:4

来自这个答案:C++终止处理程序什么时候是正确的(TM)?

如果有一个在应用程序退出时操作系统自动清理“正在”和“没有”的资源列表,那就太好了。在您的回答中,如果您可以指定操作系统/资源,最好是一些文档的链接(如果适用),那就太好了。

显而易见的一个:

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

resources operating-system
4个回答
5
投票

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

  1. 临时文件——正如其他人提到的。
  2. 全球注册
    WNDCLASS
    es。 (“卸载 DLL 时,不会注销由 DLL 注册的任何窗口类。卸载 DLL 时必须显式注销其类。”Microsoft Learn)如果您的全局窗口类也有一个 DC 类,那么该 DC 将也漏了。
  3. 全球
    ATOM
    (资源相对有限)。
  4. 用户
    ATOM
    使用
    RegisterWindowMessageW
    RegisterClipboardFormatW
    创建。 这些被设计为泄漏,因为没有相应的调用来取消注册它们。 用户原子表一直持续到用户注销为止。
  5. 信号量和事件在技术上不会泄漏,但是当所属应用程序在没有向它们发出信号的情况下消失时,其他进程可能会挂起。 对于互斥锁来说情况并非如此。 如果所属应用程序消失,则互斥锁会收到信号,从而允许另一个进程中的等待线程继续进行。
  6. 如果您在退出前未取消注册热键,Windows XP 及更早版本上可能会出现一些残留的奇怪现象。 其他应用程序可能无法注册相同的热键。
  7. 在 Windows XP 及更早版本中,进程崩溃后出现僵尸控制台窗口的情况并不罕见。 (具体来说,是一个还创建控制台窗口的 GUI 应用程序。)它显示在任务栏上。 您所能做的就是最小化、恢复或移动窗口。
  8. 退出时未显式释放资源的应用程序可能会加剧有缺陷的驱动程序。 非分页池泄漏相当常见。
  9. 数据复制到剪贴板。 我想这并不算什么,因为它当时属于操作系统所有,而不是放置它的应用程序。
  10. 在删除钩子之前安装进程崩溃时,不会卸载全局安装的钩子。

3
投票

临时文件是一个很好的例子,它不会被清理——句柄被释放,但文件没有被删除


3
投票

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

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

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

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


3
投票

任何异常都是错误——应用程序可能并且确实会崩溃并且确实包含泄漏。 操作系统需要可靠,并且即使面对编写糟糕的应用程序也不会耗尽资源。 这也适用于非操作系统资源。 向进程分配资源的服务需要在进程退出时释放这些资源。 如果不这样做,那就是一个需要修复的错误。

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

  • 创建的注册表项 没有 REG_OPTION_VOLATILE
  • 未使用 FILE_FLAG_DELETE_ON_CLOSE 创建的文件
  • 事件日志条目
  • 用于打印作业的纸张
© www.soinside.com 2019 - 2024. All rights reserved.