C++異常變量的生命週期,以及可能會遇到的坑

先看如下代碼

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;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章