throw new MyMemoryException("ex_obj1");
}
// 注意:这里是定义了按指针方式传递异常对象
catch(MyException* e)
{
cout<<endl<<"捕获到一个MyException*类型的异常,名称为:"<<e->GetName()<<endl;
delete e;
}
}
程序运行的结果是:
构造一个MyException异常对象,名称为:ex_obj1
构造一个MyMemoryException异常对象,名称为:ex_obj1
捕获到一个MyException*类型的异常,名称为:ex_obj1
销毁一个MyMemoryException异常对象,名称为:ex_obj1
销毁一个MyException异常对象,名称为:ex_obj1
呵呵!程序的运行结果是不是显示出异常对象只有一次的构造过程。挺好挺好!
异常对象什么时候被销毁
异常对象动态地在堆上被创建,同时它也要动态的被销毁,否则就必然会发生内存泄漏。那么异常对象应该在什么时候被销毁比较合适呢?当然应该是在catch block块中处理完毕后再销毁它才比较合理。示例如下:
void main()
{
try
{
// 动态在堆中构造的异常对象
throw new MyMemoryException("ex_obj1");
}
catch(MyException* e)
{
cout<<endl<<"捕获到一个MyException*类型的异常,名称为:"<<e->GetName()<<endl;
// 这里需要显示的删除异常对象
delete e;
}
}
指针方式下,异常对象会发生对象切片吗?
当然不会,试都不用试,阿愚非常有把握确信这一点。
总结
(1) 被抛出的异常对象不能是局部变量或临时变量,必须是在堆中动态构造的异常对象,或者是全局性static的变量;
(2) 异常对象只会被构造一次;
(3) catch 后面带的异常对象的作用域仅限于catch bock中;
(4) 异常对象动态地在堆上被创建,同时它也要动态的被销毁。