OS 会在崩溃后清理 vulkan 资源吗?

Does the OS clean up vulkan resources after a crash?

我正在尝试创建 C++ 类 来封装 Vulkan 初始化过程(在非常基础的水平上,我还在学习),我的设置方式需要传递 vulkan 设备一个明确的 "destroy" 函数来进行清理。我将所有初始化都包含在一个 try-catch 块中;问题是如果在初始化期间抛出异常,对象将被销毁并且我无法调用我的 "destroy" 函数。

在伪代码中:

try{
    DeviceObject device; // constructor initializes
    SomeResource resource(device);
    OtherResource other(device); // suppose an exception is thrown here

    while(programRuns){
        // do something
    }

    // end of program
    other.destroy(device);
    resource.destroy(device);
    device.destroy();
}
catch (myException e){
    showError(e);
}

在这种情况下,如果在运行时抛出异常,我的销毁函数不会被调用,它们只会在程序成功终止后调用。

我想过几种不同的设置方法来处理这种情况并确保明确清理资源,但我的问题是:我必须这样做吗?我知道我 "should",但是如果程序崩溃并退出,OS 是否会处理清理我创建的资源,或者它会在系统 GPU 上留下挂起的垃圾(或类似的东西)?

典型的OSes(包括Windows、Linux、Android等)会在进程销毁时清理进程的所有资源。这包括回收该进程独占的任何内存、关闭进程打开的文件和网络连接、减少共享资源的引用计数等。这包括销毁 GPU 上下文和任何内存或与其关联的其他资源。所以不,当你的程序崩溃时,你不会因为不清理而泄漏系统资源。

事实上,一些程序故意选择不在 clean/intentional 退出时进行清理,因为 OS 这样做通常比调用一堆应用程序终止代码更快。根据定义,代码不经常使用,因此甚至可能从未从磁盘调入,而且它通常最终会做更多的工作,而不仅仅是释放 OS-level 资源,例如为不拥有 OS-level 资源的对象调用析构函数。

在退出时优雅地清理(清理或崩溃)的主要原因是泄漏检测工具可以帮助您找到 non-termination 泄漏。如果您泄漏了所有内容,有关您泄漏的资源的报告 pre-termination —— 这可能表明有问题的 indefinitely-growing 泄漏 —— 往往会在噪音中迷失。

根据 process-based OS 的定义,给定进程的所有资源在其终止时被释放。

未捕获的异常只是进程终止的一种方式。您甚至无法捕捉到其他一些崩溃,例如堆栈溢出。因此 OS 必须 清理混乱。

我还想补充一点,如果您遵守 C++ 中的 RAII,除了例外情况,在堆栈展开期间,所有内容都会被应用程序本身正确销毁。