Что происходит, когда мы бросаем объект / переменную, чтобы поймать?
Вопрос
Два вопроса 1) Что происходит, когда объект / переменная бросается, чтобы поймать? Скажите, например,
общийЧто здесь происходит в этой ситуации? Создана и передана новая переменная ???
что делать, если я использую указатель или переменную без ссылки
нравится catch (int * i) // или catch (int i)
Кроме того, все ли переменные / ресурсы, объявленные или инициированные внутри области, были освобождены / закрыты?
2) Также в случае повторного выброса если я планирую выполнить повторный выброс со ссылкой, второй улов получит новую переменную, если я повторно выброшу без ссылки (т.е.) по значению, то изменения, сделанные в промежуточном броске, не будут затронуты ....
общийВЫХОД: catch (int & i) // выводит 2 catch (int i) // выводит 1
По моему мнению,
Я думаю, что если это ссылка, значение будет затронуто, если его «передать по значению» на промежуточном этапе. он по-прежнему бросает исходный объект во вторую ловушку.
(т.е.) поток управления для переменной на самом деле не бросает промежуточную ловушку .....
Решение
Да, при возникновении исключения все автоматические переменные уничтожен, в объеме броска и во всех охватывающих областях до тех пор, пока обработчик достигнут.
Одно примечание по этому поводу,
ваша память в dummy_ptr*
не будет освобождена, и ваш указатель на FILE
не будет закрыт.
Другие советы
Что здесь происходит в этой ситуации? Создана и передана новая переменная?
Да; когда вы бросаете объект, который он где-то создает, а затем уничтожает после обработки исключения (то есть после выхода из блока catch
без повторного создания).
что делать, если я использую указатель или переменную без ссылки? Также в случае переброса ...
Если вы поймаете по значению, вы получите копию этого объекта - если вы повторно выбросите исключение, то следующий обработчик получит новую копию оригинала и не увидит никаких изменений, которые вы могли внести. Перехват по ссылке даст вам ссылку на брошенный объект - если вы перебросите объект, следующий обработчик увидит любые внесенные вами изменения. Вы не можете поймать объект по указателю - вы поймаете указатель только в том случае, если указатель был брошен.
<цитата>Кроме того, были ли закрыты все переменные, объявленные или инициированные внутри области?
Когда генерируется исключение, все автоматические переменные уничтожаются в области действия кода throw
и всех охватывающих областях до тех пор, пока не будет достигнут обработчик. Динамически назначаемые переменные (например, ваш new int[10]
) не удаляются, а произвольные функции очистки, такие как fclose
, определенно не вызываются для переменных FILE*
, если только они не управляются объектом на основе области видимости, например умным указатель.
Я не думаю, что это можно назвать переменной;у него нет имени.Но
создается новый объект типа int
, в неуказанном месте определено
по реализации.Когда ловишь по ссылке, ссылка
привязанный к этому скрытому объекту.И когда вы упадете с конца улова
блокировать или покинуть блокировку любым способом, кроме повторного выброса
то же исключение, объект «освобожден».