当我们抛出一个要捕获的对象/变量时会发生什么

What happens when we throw an object/variable to catch?

本文关键字:变量 对象 什么 我们 一个      更新时间:2023-10-16

两个问题1) 当一个Object/变量被抛出以捕获时会发生什么?例如,

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

输出:catch(int&i)//打印2catch(int i)//打印1个

根据我的判断,

我认为,只要是参考,价值就会受到影响,如果它在中间步骤中"传递值"。它仍然将原始对象抛出到第二个捕获。

(即)变量的控制流实际上不是抛出中间陷阱。。。。。

在这种情况下,这里会发生什么?创建一个新变量然后传递?

是;当您抛出一个对象时,它是在某个地方创建的,然后在处理完异常后(即,在离开catch块而不重新抛出之后)被销毁。

如果我使用一个没有引用的指针或变量怎么办?同样在重新思考的情况下。。。

如果您按值捕获,那么您将获得该对象的副本——如果您重新引发异常,那么下一个处理程序将获得原始对象的新副本,并且不会看到您可能做出的任何更改。通过引用捕获将为您提供对抛出对象的引用-如果您重新抛出,则下一个处理程序看到您所做的任何更改。你不能用指针来捕捉对象——只有当指针被抛出时,你才能捕捉到一个指针。

此外,范围内声明或启动的所有变量是否都已关闭?

当抛出异常时,throw的作用域和所有封闭作用域中的所有自动变量都将被销毁,直到到达处理程序为止。动态分配的变量(如new int[10]不会被删除,并且FILE*变量肯定不会调用fclose等任意清理函数,除非它们由基于范围的对象(如智能指针)管理。

是的,当抛出异常时,所有自动变量已销毁,在throw和所有封闭范围内,直到已到达处理程序。

注意,您在dummy_ptr*中的内存不会被释放,并且您的FILE指针fp*也不会关闭。

我认为你不能把它称为变量;它没有名字。但是在确定的未指定位置创建类型为int的新对象通过实施。当您通过引用捕获时,引用是绑定到那个隐藏的对象。当你从捕获物的末端掉下来时阻挡,或通过除重新划动同样的例外,对象是“自由";。