(一)
如下**,假設各種子型別繼承 root class investmen:
class investment ;
investment* createinevstment(); //factory函式
void f()
在」...」區域內乙個過早return,或者期間丟擲異常,流程控制不可能經過這條語句,所以這樣的話就會導致資源洩露。
解決方法:
為了確保createinvestment返回的資源總是被釋放,我們需要將資源放進物件內,當控制流離開函式f的時候,物件的析構函式會自動釋放那些資源。把資源放進物件,我們便可以依賴c++的「析構函式自動呼叫機制「確保資源被釋放。
智慧型指標:auto_ptr是個」類指標物件「,其析構函式自動對其所指物件呼叫delete
class investment;
investment * createinvestment();// factory函式宣告
void f()
//經由auto_ptr 析構函式自動刪除 pinv
1 createinvestment() 以資源取得時便是初始化時,每一筆資源在獲得同時立即被放進管理物件中。
2無論控制流如何離開區塊,一旦物件被銷毀,其析構函式自然被呼叫,遇事資源就被釋放。
(二)auto_ptr有個性質:若通過copy建構函式或者copy assignment操作符賦值他們。他們會變成null,而賦值所得的指標將取得資源的唯一擁有權。
auto_ptrpinv1(createinvestment());
auto_ptrpinv2(pinv1); //現在pinv2指向物件,pinv1被設為null
pinv1 = pinv2; //現在pinv1指向物件,pinv2被設為null
這個詭異的複製行為,使得要求其元素發揮」正常的「賦值行為的像stl容器容不得auto_ptr。
解決方法是使用:引用計數型智慧型指標 shared_ptr
(三)"引用計數型指標「。tr1::shared_ptr(比如 boost庫里的 boost::shared_ptr.)他是個智慧型指標,持續追蹤共有多少個物件指向某筆資源,並在沒人指向它時,自動刪除該資源。
void f()
//經由shared_ptr的析構函式
雖然看起來跟 auto_ptr相同。但是 shared_ptr的複製行為正常
void f()
//pinv1和pinv2被銷毀,他們指向的物件也就被銷毀。
(四)
兩種指標底層實現都是 delete 而不是delete,所以不要把它們用在動態分配陣列上。
vector 跟string幾乎總是可以取代動態分配而得的陣列。
請記住:
1 為了防止資源洩露,請使用raii物件。它們在建構函式中獲得的資源並在析構函式中釋放資源。
2 兩個常被使用的raii classes 分別是 auto_ptr 和 tr1::shared_ptr。後者是較佳選擇。因為copy行為直觀。若選擇auto_ptr,複製動作會使(被複製)指向null。
條款13 以物件管理資源
問題 解決 智慧型指標。把資源放入物件內,利用析構函式確保釋放。1 資源取得時機便是初始化時機 resource acquisition is initialization raii 2 管理物件運用析構函式確保資源被釋放。別讓auto ptr同時指向同一物件。為了預防這個問題,能過copy建構函式...
條款13 以物件管理資源
我們都知道,當new乙個東西之後,必須delete它。但是問題可能出現在在new和delete之間 比如中間出現了異常,或者return之類的。一種比較好的作法是通過物件來管理 因為當物件的宣告週期結束以後,會呼叫析構函式,而在析構函式中delete,這樣的作法就靠譜多了。在標準c 中,定義了2種管...
條款13 以物件管理資源
所謂有資源,就是你一旦使用了它,就要記得歸還系統。如果不這樣做,就會發生資源的浪費。這裡的資源不僅僅是指記憶體,也包括 檔案描述符,互斥鎖,資料庫連線 本條款是乙個直接而易懂的基於物件的資源管理方法,建立在c 對建構函式,析構函式,copy函式的基礎上。經驗顯示,經過訓練後嚴守這些做法,可以幾乎消除...