来自这个答案:C++终止处理程序什么时候是正确的(TM)?
如果有一个在应用程序退出时操作系统自动清理“正在”和“没有”的资源列表,那就太好了。在您的回答中,如果您可以指定操作系统/资源,最好是一些文档的链接(如果适用),那就太好了。
显而易见的一个:
内存:是的,自动清理。 问题。有没有例外?
当应用程序崩溃或退出而没有明确释放它们时,Windows 不会清理一些模糊的资源,主要是因为操作系统不知道它们是否重要。
WNDCLASS
es。 (“卸载 DLL 时,不会注销由 DLL 注册的任何窗口类。卸载 DLL 时必须显式注销其类。”Microsoft Learn)如果您的全局窗口类也有一个 DC 类,那么该 DC 将也漏了。ATOM
(资源相对有限)。ATOM
使用 RegisterWindowMessageW
和 RegisterClipboardFormatW
创建。 这些被设计为泄漏,因为没有相应的调用来取消注册它们。 用户原子表一直持续到用户注销为止。临时文件是一个很好的例子,它不会被清理——句柄被释放,但文件没有被删除
在 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
当应用程序关闭时,所有这些都应该由操作系统恢复,尽管可能不会立即恢复,具体取决于其他进程对它们的使用情况。
其他操作系统的工作方式相同。很难想象一个操作系统名副其实(我不包括嵌入式系统等),但事实并非如此——资源管理是操作系统存在的第一大理由。
任何异常都是错误——应用程序可能并且确实会崩溃并且确实包含泄漏。 操作系统需要可靠,并且即使面对编写糟糕的应用程序也不会耗尽资源。 这也适用于非操作系统资源。 向进程分配资源的服务需要在进程退出时释放这些资源。 如果不这样做,那就是一个需要修复的错误。
如果您正在寻找可以在进程退出后持续存在的程序工件,那么在 Windows 上您至少有: