gpt4 book ai didi

c++ - 通过引用捕获(使用 catch)时异常对象的范围

转载 作者:行者123 更新时间:2023-11-30 01:12:56 26 4
gpt4 key购买 nike

我有 3 个问题:

1. 总是说通过引用捕获异常对象。在下面的示例中,我看到析构函数在 catch block 执行之前被调用,这意味着我们指的是 catch 中的一个对象,它一定已经超出了范围我们使用它的时间。为什么要使用引用?

class MyException{
public:
~MyException() {
cout<<"Dtor for MyException called \n";
}
};
int main()
{
try{
MyException obj1;
throw obj1;
}
catch(MyException& obj)
{
cout<<"Catched unhandled exception";
}
}

2. 为什么这里的析构函数被调用了两次?一次是在进入 catch block 之前,第二次是在 catch 执行完成之后。

3. Lifetime of a thrown object caught by reference中的例子显示析构函数仅被调用一次,即在 catch block 退出之后,仅当类中定义了一个复制构造函数时。

a.当我们通过引用捕获它时,复制构造函数在这里的作用是什么?

b. 即使在定义了复制构造函数之后,它也永远不会被调用。那么它有什么影响呢?

c. 我也尝试在我的示例中定义一个复制构造函数,如下所示,但我仍然看到析构函数被调用了两次。为什么?:

MyException(const MyException& obj)
{
}

谁能回答所有 5 个问题(第 3 个问题有 3 个部分)。

最佳答案

您正在抛出您作为本地临时对象创建的异常的拷贝。所以有两个:第一个在你抛出时被销毁,第二个(拷贝)在 catch block 完成后被销毁。

试试这个:

try { throw MyException{}; }
catch (MyException const& obj) { }

编辑:如果你的复制构造函数真的没有在你的代码中被调用,那么我的猜测是编译器已经识别出异常类是空的?编译器可以自由地执行它选择的任何优化,只要代码的行为就好像它没有一样。复制省略是个异常(exception),但如果发生这种情况,您将不会收到双重析构函数调用。

关于c++ - 通过引用捕获(使用 catch)时异常对象的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33188891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com