Что происходит, когда мы бросаем объект / переменную, чтобы поймать?

StackOverflow https://stackoverflow.com/questions/9399467

  •  29-10-2019
  •  | 
  •  

Вопрос

Два вопроса 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, в неуказанном месте определено по реализации.Когда ловишь по ссылке, ссылка привязанный к этому скрытому объекту.И когда вы упадете с конца улова блокировать или покинуть блокировку любым способом, кроме повторного выброса то же исключение, объект «освобожден».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top