为什么将异常的析构函数调用两次?

类型

我有以下程序:

#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创建了一个新对象,但是我不明白为什么要调用类析构函数。

Angew不再为SO感到骄傲

如果您检测异常的复制或移动构造函数,则会发现该异常在处理程序之前被调用一次。有一个临时的异常对象,将抛出的表达式复制/移动到其中,并且处理程序中的引用将绑定到异常对象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";

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么析构函数被调用两次?

为什么要尝试两次查找析构函数?

为什么析构函数比构造函数调用得更多?

为什么析构函数调用两次表单?

Singleton:析构函数如何被两次调用?

完美的转发,为什么析构函数被调用两次?

静态unique_ptr两次调用析构函数

在析构函数中引发异常时,为什么不调用重载的删除?

为什么要调用析构函数

C ++ make_shared两次调用析构函数

为什么在Friend函数中调用析构函数

在循环内部创建的返回变量导致析构函数被调用两次

vector :: emplace_back结果两次调用析构函数

为什么在此代码中调用了2次析构函数?

为什么std :: shared_ptr两次调用我的析构函数?

为什么代码两次调用析构函数?

为什么析构函数被调用两次而构造函数仅被调用一次?

为什么该程序中的析构函数被调用两次?

为什么C ++偏向于析构函数的异常?

为什么析构函数被两次调用时我的程序不会崩溃

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

参考计数器和析构函数被调用两次

析构函数调用两次

为优化级别为 0 的 std::vector 调用两次析构函数

析构函数使用静态对象调用两次

类和成员析构函数调用两次

为什么类的构造函数被调用了四次,而在程序即将结束的时候,析构函数只被调用了两次?

unique_ptr 两次调用析构函数

为什么不调用析构函数?