item 13:以物件管理資源
關鍵的兩個想法(這種方式其實在很多地方都可以看出影子,比如managing pool的模型):
1.獲得資源後立刻放入管理物件(managing object):以物件管理資源的觀念常常被稱為「資源取得之時就是初始化時機」(resourece acquisition is initialization;raii),因為我們總是在獲得資源後,在同一語句內用它來初始化某個管理物件。有時候獲得的資源被拿來賦值(而非初始化)某個管理物件。但不管哪一種做法,每一筆資源都在獲得的同時立刻被放入管理物件中。
2.管理物件(managing object)運用析構函式確保資源被釋放:不管控制流如何離開區域塊,一旦物件被銷毀(例如當物件離開作用域時),其析構函式自然會被自動呼叫,於是資源被釋放。如果資源釋放動作可能丟擲異常,事情就變的有些棘手了(可以參考item8)。
總結:
1.為防止洩漏資源,請使用raii物件,它們在建構函式中獲得資源並且在析構函式中釋放資源。
2.兩個常被使用的raii classes是shared_ptr和auto_ptr。前者通常是最佳選擇,因為其copy行為比較直觀。若選擇auto_ptr,複製動作會使它(被複製物)指向null。
item 14:在資源管理類中要小心copying行為
對於那些並不是在heap-based的資源,採用auto_ptr,shared_ptr並不是乙個好方法,這時候我們需要自己建立乙個管理類,這時候我們就會面臨乙個問題:「當乙個raii class被複製時候,我們要怎麼選擇?」
1.禁止複製。如item6中告訴我們的,可以將賦值建構函式和操作符設定為private:
class lock
; lock(const lock&){};
}
2.對底層資源使用「引用計數法」。有時候我們希望保有資源,直到它的最後乙個使用者(某物件)被銷毀。這種情況下複製raii物件,應該將該資源的count變數+1,shared_ptr就是如此。
3.複製底部資源。
4.轉移底部資源控制權。這一條就是auto_ptr所奉行的複製意義。
總結:
1.複製raii物件必須一併複製它所管理的資源,所以資源的copying行為決定raii物件的copying行為。
2.普遍而常見的raii class copying行為是:抑制copying、實施引用計數法。不過其他的行為也可能被實現。
item15:在資源管理類中提供對原始資源的訪問
總結:
1.apis往往要求訪問原始資源,所以每乙個raii class應該提供乙個「取得其管理的資源的方法」。
2.對原始資源的訪問可能經由顯式或者隱式轉換。一般而言顯式轉換比較安全,但隱式轉換對客戶比較方便。
item16:成對使用new和delete時要採取相同的形式
總結:如果你在new表示式中使用了,必須在相對應的delete表示式中也使用。如果你在new的表示式中沒有使用,一定不要在相應的delete表示式中使用。
(不管是哪一種情況搞反了,都會導致未定義的結果)
item17:以獨立語句將newed物件置入智慧型指標
總結:以獨立語句將newed物件儲存於智慧型指標中。如果不這麼做,一旦異常被丟擲,有可能導致難以察覺的記憶體洩漏。
Effective C 3 資源管理
problem void f solution.1 使用auto ptr智慧型指標確保資源的釋放,避免記憶體洩露 void f key points 以物件管理資源 的兩個關鍵想法 1.獲得資源後立刻放進管理物件內 如auto ptr 2.管理物件運用析構函式確保資源被釋放 attention au...
Effective C 筆記 3 資源管理
class investment investment createinvestment 返回指標,指向investment繼承體系內的動態分配單元void f 把資源放入物件內,便可依賴c 的析構函式自動呼叫機制確保資源被釋放 許多資源被動態分配與堆中,而後被用於單一區塊或函式內,他們應該在控制流...
Effective C 總結 3 資源管理
資源管理,一旦用了,就必須將其還給系統。資源包括動態記憶體分配,檔案描述器,互斥鎖,圖形介面的字型,筆刷,資料庫連線,網路sockets。遇到的問題 voidf 在上述 中,在heap上申請記憶體空間,然後經過 然後使用delete釋放申請的記憶體空間。但是,在 的執行過程中,可能會存在return...