操作系统崩溃后是否会清理 vulkan 资源?

ysw*_*rer 1 resource-cleanup vulkan

我正在尝试创建 C++ 类来封装 Vulkan 初始化过程(在非常基础的层面上,我仍在学习),并且我的设置方式要求将 vulkan 设备传递给显式的“销毁”函数进行清理发生。我将所有初始化都包含在 try-catch 块中;问题是,如果在初始化期间引发异常,对象将被销毁,并且我无法调用我的“销毁”函数。

在伪代码中:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jes*_*all 5

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

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

在退出时优雅地清理(清理或崩溃)的主要原因是泄漏检测工具可以帮助您找到非终止泄漏。如果您泄漏了所有内容,则有关您在终止前泄漏的资源的报告(这可能表明有问题的无限增长的泄漏)往往会在噪音中迷失。