当我们抛出一个要捕获的对象/变量时会发生什么?
题
两个问题 1)当一个对象/变量被抛出时会发生什么?例如, 通用标签
在这种情况下,这里会发生什么?创建并传递了一个新变量??
如果我使用指针或没有引用的变量
喜欢 catch(int * i)//或catch(int i)
此外,是否已释放/关闭范围内声明或初始化的所有变量/资源?
2)还是在重新扔球的情况下, 如果我计划使用参考值进行重新抛出,则第二个捕获将获得一个新变量,如果我使用参考值(即按值)进行重新抛出,那么在中间抛出中所做的更改不会受到影响。 通用标签
输出: catch(int&i)//打印2 catch(int i)//打印1
根据我的判断
我认为,只要是参考,该值就会受到影响, 如果它是中间步骤中的“按值传递”。它仍然将原始对象扔到第二个捕获。
(即,变量的控制流实际上不会抛出中间陷阱.....
解决方案
是的,当引发异常时,所有自动变量都是 在抛出范围和所有封闭范围内被销毁,直到 到达处理程序。
对此请注意, 您在
dummy_ptr*
中的内存不会被释放,并且您的FILE
指针fp*
也不会关闭。
其他提示
在这种情况下,这里会发生什么?创建新变量然后传递?
是;当您抛出一个对象时,它会在某个地方创建,然后在处理完异常之后将其销毁(即,在不重新抛出的情况下离开了
catch
块)。如果我使用指针或没有引用的变量该怎么办?同样是在重新扔球的情况下……
如果按值捕获,则将获得该对象的副本-如果重新引发异常,则下一个处理程序将获得原始对象的新副本,并且不会看到您可能进行的任何更改。通过引用捕获将为您提供对所抛出对象的引用-如果您重新抛出,则下一个处理程序 会看到您所做的任何更改。您不能通过指针捕获对象-仅在抛出指针时才捕获指针。
而且,是否已关闭在作用域内声明或初始化的所有变量?
引发异常时,所有自动变量都将被销毁,该自动变量将在
throw
的范围内以及所有封闭的范围内,直到到达处理程序为止。动态分配的变量(例如您的new int[10]
)不会被删除,并且不会自动删除诸如fclose
之类的任意清理函数,除非它们由基于范围的对象(例如智能对象)来管理指针。
我认为您不能将其称为变量;它没有名字。但是一个
在确定的未指定位置创建了int
类型的新对象
通过执行。当您通过引用捕获时,引用是
绑定到该隐藏对象。当你跌倒了
块,或通过其他方法离开捕获块,而不是重新抛出
同样的例外,对象被“释放”。