先看如下代码
class MyException
{
public:
MyException()
{
cout << "MyException的默认构造" << endl;
}
MyException(const MyException & e)
{
cout << "MyException的拷贝构造" << endl;
}
~MyException()
{
cout << "MyException的析构调用" << endl;
}
void printError()
{
this->m_A = 100;
cout << "error" << m_A<< endl;
}
int m_A;
};
void doWork()
{
throw &MyException();
}
void test01()
{
try
{
doWork();
}
catch (MyException *e)
{
e->printError();
cout << "捕获异常" << endl;
//delete e; //靠自觉 释放对象
}
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
throw &MyException(); throw 后面跟的就是异常变量,当然&MyException();表示一个匿名变量,现在我们就来讨论一下,异常变量的生命周期。
以上代码在运行的时候,好像没有问题,但这里面是存在了一个潜在的风险,下面就来说明一下。
throw &MyException(); 当这句代码执行完的时候,实际上MyException对象就已经被释放了。
catch(MyException *e) 中的e此时去获取,将获取到null,一个null去调用printError(),虽然成功了,但这只是表象,去其他环境,可能就出错了,所以这种做法不可取。那么应该如何做,才能让throw MyException时,对象不会被释放呢?
答案是利用引用,具体做法,请参考如下代码
class MyException
{
public:
MyException()
{
cout << "MyException的默认构造" << endl;
}
MyException(const MyException & e)
{
cout << "MyException的拷贝构造" << endl;
}
~MyException()
{
cout << "MyException的析构调用" << endl;
}
void printError()
{
this->m_A = 100;
cout << "error" << m_A<< endl;
}
int m_A;
};
void doWork()
{
throw MyException();
}
void test01()
{
try
{
doWork();
}
catch (MyException &e)
{
e->printError();
cout << "捕获异常" << endl;
//delete e; //靠自觉 释放对象
}
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}