先看如下代碼
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;
}