gpt4 book ai didi

c++ - 为什么异常的析构函数被调用两次?

转载 作者:IT老高 更新时间:2023-10-28 22:37:28 25 4
gpt4 key购买 nike

我有以下程序:

#include <iostream>
#include <stdexcept>
#include <string>

using namespace std;

class MyError : public runtime_error
{
public:
MyError(string mess = "");
~MyError(void);
};

MyError::MyError(string mess) : runtime_error(mess)
{
cout << "MyError::MyError()\n";
}

MyError::~MyError(void)
{
cout << "MyError::~MyError\n";
}


int main(void)
{
try {
throw MyError("hi");
}
catch (MyError& exc) {
cout << exc.what() << endl;
}

cout << "goodbye\n";
return 0;
}

打印以下内容:

MyError::MyError()
MyError::~MyError
hi
MyError::~MyError
goodbye

为什么异常的析构函数(~MyError())被调用了两次?

我假设 throw 创建了一个新对象,但我不明白为什么要调用类析构函数。

最佳答案

如果您检测异常的复制或移动构造函数,您会发现它在处理程序之前被调用一次。抛出的表达式被复制/移动到一个临时异常对象,处理程序中的引用将绑定(bind)到这个异常对象。 C++14 15.1/3+

因此,由您的代码产生的执行看起来像这样(伪 C++):

// throw MyError("hi"); expands to:
auto tmp1 = MyError("hi");
auto exceptionObject = std::move(tmp1);
tmp1.~MyError();
goto catch;

// catch expands to:
MyError& exc = exceptionObject;
cout << exc.what() << endl;

// } of catch handler expands to:
exceptionObject.~MyError();

// normal code follows:
cout << "goodbye\n";

关于c++ - 为什么异常的析构函数被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30309038/

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