【发布时间】:2012-07-07 05:50:28
【问题描述】:
class Error1
{
public:
int errorcode;
Error1(int x):errorcode(x){ cout<<"CTOR Error1"<<endl; }
//Error1(Error1& obj ){
// errorcode = obj.errorcode;
// cout<<"CopyCTOR Error1"<<endl;
//}
~Error1(){cout<<"DTOR Error1"<<endl; }
};
void fun()
{
cout<<"Inside fun"<<endl;
throw(Error1(5));
}
int main()
{
try{
fun();
}
catch(Error1& eobj)
{
cout<<"Error1 type occured with code:"<<eobj.errorcode<<endl;
}
cin.get();
}
输出:
Inside fun
CTOR Error1
DTOR Error1
Error1 type occured with code:5
DTOR Error1
此输出表明 Error1 对象是为 catch 处理程序复制构造的。由于没有为 Error1 对象定义复制构造函数,因此使用了默认复制构造函数。
当我取消注释用于定义复制构造函数的注释部分时,我得到以下输出。
Inside fun
CTOR Error1
Error1 type occured with code:5
DTOR Error1
为什么只有一个 DTOR 被调用?即使异常被引用捕获,我相信仍然会创建一个临时的。
【问题讨论】:
-
看起来输出取决于编译器和异常运行时实现。例如,gcc 4.3.4 不会为您的第一个代码示例使用默认的复制构造函数生成任何临时文件。你可以在这里看到一个例子:ideone.com/9QyLf
-
首先,如果您将 DTOR 定义为虚拟,您将获得与第二个相同的第一个行为。
-
@klement:这里没有发生多态行为,所以我相信使用
virtualDTOR's 是不必要的 -
@Jason:我已经安排了一个实验,我在 VS2010 中得到的结果 - virtual 使两个代码部分都能正常工作。
-
@klement:在 gcc 中,我得到相同的结果,而无需添加
virtual... 所以再次,使用virtual关键字可能是 VS2010 特有的怪癖,但它是“不必要的” C++ 语言一般适用于这个特定场景...
标签: c++ visual-c++ exception exception-handling