两个问题 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类型的新对象 通过执行。当您通过引用捕获时,引用是 绑定到该隐藏对象。当你跌倒了 块,或通过其他方法离开捕获块,而不是重新抛出 同样的例外,对象被“释放”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top