c++設計中可以利用析構函數避免泄露資源

假設有這樣一個函數

B::virtual void fun(int i)

{

while(i--)

{

A* ptr=readdata(i);//其中A爲抽象基類

ptr->fun1();//假設fun1是A中的純虛函數

delete ptr;

}

}

對於上面的代碼,當ptr->fun1();出了異常,則程序永遠不會delete ptr,造成資源的泄漏。

要避免這一點,可以這樣寫

B::virtual void fun(int i)

{

while(i--)

{

A* ptr=readdata(i);

try{

ptr->fun1();

}

catch(...){

delete ptr;

throw();

}

delete ptr;//沒有異常拋出時,delete ptr

}

}

這樣很麻煩,delete ptr 重複了。

解決辦法:

以一個“類似指針的對象”取代指針(智能指針)。

我們可以在智能指針的析構函數中將指針delete。

因爲,局部對象總是在函數結束時被析構。

c++中的智能指針:auto_ptr、shared_ptr.weak_ptr、unique_ptr

參考自more effective c++。

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