Очищает ли ОС ресурсы вулкана после сбоя? - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь создать классы C ++ для инкапсуляции процедур инициализации Vulkan (на очень базовом уровне, я все еще учусь), и способ, которым я настраиваю, требует, чтобы устройство vulkan передавалось явному «уничтожить»функция для очистки, чтобы произойти.У меня вся инициализация окружена блоком try-catch;проблема заключается в том, что если во время инициализации возникает исключение, объекты уничтожаются, и я не могу вызвать свои функции «уничтожить».

В коде psuedo:

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);
}

В этомВ этом случае мои функции уничтожения не вызываются, если во время выполнения выдается исключение, и они вызываются только после успешного завершения программы.

Я думал о нескольких различных способах настройки вещей для обработки этой ситуации.и убедитесь, что ресурсы явно очищены, но мой вопрос: должен ли я?Я знаю, что «должен», но справится ли ОС с очисткой созданных мной ресурсов, если программа аварийно завершит работу и выйдет из системы, или же она оставит зависание на системном графическом процессоре (или что-то в этом роде)?

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Типичные операционные системы (включая Windows, Linux, Android и т. Д.) Очищают все ресурсы процесса, когда процесс уничтожается.Это включает в себя восстановление любой памяти, принадлежащей исключительно этому процессу, закрытие файлов и сетевых подключений, открытых процессом, уменьшение числа ссылок на общие ресурсы и т. Д. Это включает в себя уничтожение контекстов графического процессора и любой памяти или других ресурсов, связанных с ними.Поэтому нет, вы не будете пропускать системные ресурсы, если не очистите программу при сбое.

На самом деле, некоторые программы сознательно выбирают также не выполнять очистку при чистом / преднамеренном выходе, поскольку ОС часто работает быстрее.на этом, чем вызывая кучу кода завершения приложения.По определению вид, что код используется не часто, поэтому, возможно, никогда даже не был выгружен с диска, и он часто заканчивает тем, что выполнял больше работы, чем просто освобождение ресурсов уровня ОС, например, вызывая деструкторы для объектов, которые не владеютРесурсы на уровне операционной системы.

Основная причина изящной очистки при выходе (как чистой, так и аварийной) состоит в том, что инструменты обнаружения утечек могут помочь вам обнаружить утечки без прерывания.Если вы все пропускаете, отчеты о ресурсах, которые вы пропустили, до завершения - что может указывать на проблемные утечки, бесконечно растущие - как правило, теряются в шуме.

0 голосов
/ 06 июня 2019

По определению ОС на основе процессов все ресурсы данного процесса высвобождаются после его завершения.

Неподтвержденное исключение - только один из способов, которым процесс может завершиться.Вы даже не сможете поймать некоторые другие сбои, например переполнение стека.Поэтому ОС имеет , чтобы устранить эту ошибку.

Я также хотел бы добавить, что если вы будете придерживаться RAII в C ++ с исключениями, все будет должным образом уничтожено самим приложением во время разматывания стека.

...