Что происходит, когда мы бросаем объект / переменную для перехвата? - PullRequest
1 голос
/ 22 февраля 2012

Два вопроса 1) Что происходит, когда объект / переменная выбрасывается, чтобы поймать?Скажем, например,

int foo() {
   FILE *fp = ....;
   int dummy = 10;
   int *dummy_ptr = new int[10];
   throw 1;
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}

Что в этой ситуации происходит здесь?Новая переменная создана и затем передана ???

, что если я использую указатель или переменную без ссылки

, например catch (int * i) // или catch (int i)

Кроме того, все переменные / ресурсы, объявленные или инициированные в области видимости, были освобождены / закрыты?

2) Также в случае повторного выброса, если я планирую повторное бросание со ссылкой, втораяcatch получает новую переменную, если я переброшу без ссылки (т. е. по значению), то изменения, внесенные в промежуточный бросок, не будут затронуты ...

int goo() {
    throw 2;
}

int foo() {
   try{
      goo();
   } catch(int &i) { // (or) catch(int i) // i is not changing in the next line.
      i = 2;
      throw;
   }
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}

OUTPUT: catch (int & i)// печатает 2 catch (int i) // печатает 1

По моему мнению,

Я думаю, что до тех пор, пока оно является ссылочным, значение будет затронуто, если его 'pass'по значению »на промежуточном этапе.это все еще бросает оригинальный объект во второй улов.

(т.е.) поток управления для переменной действительно не выбрасывает промежуточный улов .....

Ответы [ 3 ]

5 голосов
/ 22 февраля 2012

Что в этой ситуации происходит здесь? Новая переменная создана и затем передана?

Да; когда вы бросаете объект, он создается где-то, а затем уничтожается после обработки исключения (то есть после выхода из блока catch без повторной обработки).

что если я использую указатель или переменную без ссылки? Также в случае повторного броска ...

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

Кроме того, все переменные, объявленные или инициированные внутри области действия, были закрыты?

Когда генерируется исключение, все автоматические переменные уничтожаются в области действия throw и всех входящих в него областей, пока не будет достигнут обработчик. Динамически распределяемые переменные (такие как new int[10]) не удаляются, и произвольные функции очистки, такие как fclose, безусловно, не вызываются для FILE* переменных, если они не управляются на основе области объект, такой как умный указатель.

0 голосов
/ 22 февраля 2012

Я не думаю, что вы можете назвать это переменной;у него нет имени.Но новый объект типа int создается в неопределенном месте, определяемом реализацией.Когда вы ловите по ссылке, ссылка привязывается к этому скрытому объекту.И когда вы падаете с конца блока catch или покидаете блок catch любым способом, кроме повторного выброса того же исключения, объект «освобождается».

0 голосов
/ 22 февраля 2012

Да, когда выдается исключение, все автоматические переменные уничтожен, в объеме броска и всех прицелов до обработчик достигнут.

Одна записка об этом, Ваша память в dummy_ptr* не будет освобождена, а указатель FILE fp* не будет закрыт.

...