【发布时间】:2015-05-18 17:04:10
【问题描述】:
我有以下程序:
#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 创建了一个新对象,但我不明白为什么要调用类析构函数。
【问题讨论】:
-
您的异常在抛出时会被复制。第一个析构函数来自
try块,第二个是复制的异常。 -
异常临时被复制,但这个副本可能被省略。如果是,你只会看到一个析构函数调用:coliru.stacked-crooked.com/a/f1e5773144874712
-
@wheatin 这个问题是关于添加到集合中的对象的析构函数,我不认为是一样的。
-
你用的是什么编译器?
标签: c++ destructor