当我们抛出一个要捕获的对象/变量时会发生什么
What happens when we throw an object/variable to catch?
两个问题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
的新对象通过实施。当您通过引用捕获时,引用是绑定到那个隐藏的对象。当你从捕获物的末端掉下来时阻挡,或通过除重新划动同样的例外,对象是“自由";。
- 你能重载对象变量名本身返回的内容吗
- 将包含C样式数组的对象初始化为成员变量(C++)
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么我们再次从结构对象创建结构变量?
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- 从变量对象指向基对象
- C++ - 我可以创建编译时变量对象吗?
- 动态数组添加元素而不创建结构变量/对象
- Visual Studio C++ 编译器在局部变量对象上的奇怪行为
- 其中定义函数的静态局部变量对象
- QT良好的全局变量/对象处理
- r 值的匿名变量对象与真实对象
- QT 测试 - 变量/对象失去价值
- 访问私有变量对象
- C++访问具有相同名称的变量/对象的命名空间中的全局变量/对象
- C++-访问全局变量对象
- 表达式必须具有类类型:c++,将实例变量对象作为指针传递(点表示法参数)
- C++变量/对象和堆内存管理
- 如何在每次迭代中创建一个新变量/对象的循环
- 初始化现有变量/对象的新构造函数