异常对象在什么时候构造?
1、与按值和按引用传递异常的方式相比,在按指针传递异常的方式下,异常对象的构造方式有很大的不同。它必须是在堆中动态构造的异常对象,或者是全局性static的变量。示例程序如下:
void main()
{
try
{
// 动态在堆中构造的异常对象
throw new MyMemoryException("ex_obj1");
}
catch(MyException* e)
{
cout<<endl<<"捕获到一个MyException*类型的异常,名称为:"<<e->GetName()<<endl;
delete e;
}
}
2、注意,通过指针方式传递的异常对象不能是局部变量,否则后果很严重,示例如下:
void main()
{
try
{
// 局部变量,异常对象
MyMemoryException ex_obj1("ex_obj1");
// 抛出一个指针类型的异常
// 注意:这样做很危险,因为ex_obj1这个对象离开了这个作用域即
// 析构销毁
throw &ex_obj1;
}
catch(MyException* e)
{
// 下面语句虽然不会导致程序崩溃,但是e->GetName()取得的结果
// 也是不对的。
cout<<endl<<"捕获到一个MyException*类型的异常,名称为:"<<e->GetName()<<endl;
// 这条语句会导致程序崩溃
// delete e;
}
}
程序运行的结果是:
构造一个MyException异常对象,名称为:ex_obj1
构造一个MyMemoryException异常对象,名称为:ex_obj1
销毁一个MyMemoryException异常对象,名称为:ex_obj1
销毁一个MyException异常对象,名称为:ex_obj1
捕获到一个MyException*类型的异常,名称为:
异常对象按指针方式被传递
void main()
{
try
{
// 动态在堆中构造的异常对象