分页:
上一页 1 [2] 3 4 5 6 7 8 9 下一页
// 注意这时VC编译器会复制一份新的异常对象,临时变量
throw ex_obj1;
}
}
catch(...)
{
cout<<"catch unknow exception"<<endl;
}
}
程序运行的结果是:
构造一个MyException异常对象,名称为:ex_obj1
拷贝一个MyException异常对象,名称为:ex_obj1
销毁一个MyException异常对象,名称为:ex_obj1
catch unknow exception
销毁一个MyException异常对象,名称为:ex_obj1
瞧见了吧,异常对象确实是被复制了一份,如果还不相信那份异常对象是在throw ex_obj1这条语句执行时被复制的,你可以在VC环境中调试这个程序,再把这条语句反汇编出来,你会发现这里确实插入了一段调用拷贝构造函数的代码。
2、而且其它几种抛出异常的方式也会有同样的结果,都会构造一份临时局部变量。执着的阿愚可是每种情况都测试了一下,代码如下:
// 这是全局变量的异常对象
// MyException ex_global_obj("ex_global_obj");
void main()
{
try
{
{
// 构造一个异常对象,这是局部变量
MyException ex_obj1("ex_obj1");
throw ex_obj1;
// 这种也是临时变量
// 这种方式是最常见抛出异常的方式
//throw MyException("ex_obj2");
// 这种异常对象原来是在堆中构造的
// 但这里也会复制一份新的异常对象
// 注意:这里有资源泄漏呦!
//throw *(new MyException("ex_obj2"));
// 全局变量
// 同样这里也会复制一份新的异常对象
//throw ex_global_obj;
}
}
catch(...)
{
cout<<"catch unknow exception"<<endl;
}
大家也可以对每种情况都试一试,注意是不是确实无论哪种情况都会复制一份本地的临时变量了呢!
分页:
上一页 1 [2] 3 4 5 6 7 8 9 下一页