假設有這樣一個函數
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++。