分页:
上一页 1 2 3 4 [5] 6 7 8 9 下一页
{
try
{
{
// 构造一个对象,当obj对象离开这个作用域时析构将会被执行
MyException ex_obj1("ex_obj1");
throw ex_obj1;
}
}
// 由于这里定义的是“按值传递”,所以这里会发生一次拷贝构造过程
catch(MyException e)
{
cout<<"捕获到一个MyException类型的异常,名称为:"<<e.GetName()<<endl;
}
// 加入一条语句,判断e什么时候销毁
cout<<"在这之前还是之后呢?"<<endl;
}
程序运行的结果是:
构造一个MyException异常对象,名称为:ex_obj1
拷贝一个MyException异常对象,名称为:ex_obj1
拷贝一个MyException异常对象,名称为:ex_obj1
销毁一个MyException异常对象,名称为:ex_obj1
捕获到一个MyException类型的异常,名称为:ex_obj1
销毁一个MyException异常对象,名称为:ex_obj1
销毁一个MyException异常对象,名称为:ex_obj1
在这之前还是之后呢?
看到了吗!发生那条语句之前,因此基本可以判断那个异常对象是在离开catch block时发生的析构,这样也算是情理之中,毕竟catch block中的异常处理模块对异常对象的存取使用已经完毕,过河拆桥有何不对!。为了进一步验证一下。从VC中copy出相关的反汇编代码。如下:
368: catch(MyException e)
00401CDA mov byte ptr [ebp-4],3
369: {
370: cout<<"捕获到一个MyException类型的异常,名称为:"<<e.GetName()<<endl;
00401CDE lea eax,[ebp-64h]
00401CE1 push eax
00401CE2 lea ecx,[e]
00401CE5 call @ILT+60(MyException::GetName) (00401041)
00401CEA mov dword ptr [ebp-70h],eax
00401CED mov ecx,dword ptr [ebp-70h]
分页:
上一页 1 2 3 4 [5] 6 7 8 9 下一页