Effective c++ 條款13:以物件管理資源
所謂資源就是,一旦用了他,將來必須還給系統。比如記憶體,互斥鎖、圖形介面中的字型和筆刷、資料庫連線以及網路socket等。
1、資源取得時機便是初始化時機
RAII, Resource Acquisition Is Initialization
2、為確保資源總是被釋放,需要將資源放進物件內
將資源放進物件內,當控制流離開某個申請資源的函式時,該物件的解構函式會自動釋放那些資源。
獲得資源後立刻放進管理物件內。
管理物件運用解構函式確保資源被釋放。
標準資料庫提供的auto_ptr正是針對這種形勢而設計的特製產品。由於auto_ptr被銷燬時會自動刪除它所指之物,所以一定要注意別讓多個auto_ptr指向同一物件。
auto_ptr的替代方案是“引用計數型智慧指標”shared_ptr,其持續追蹤共有多少物件指向某筆資源,並在無人指向它時自動刪除該資源。
關於現有的智慧指標的好處和劣處網上的資料比較多,建議更深入瞭解。
相關推薦
Effective c++ 條款13:以物件管理資源
所謂資源就是,一旦用了他,將來必須還給系統。比如記憶體,互斥鎖、圖形介面中的字型和筆刷、資料庫連線以及網路socket等。 1、資源取得時機便是初始化時機 RAII, Resource Acquisition Is Initializati
effective c++乾貨之條款13:以物件管理資源
對於c++來說,一般所指的資源就是動態分配的記憶體,其實資源還包括互斥鎖,網路套接字等。 如果我們定義了一個物件: class Bird { //... }; 在一個函式中,如果我們new了一個Brid物件: void Fun() { Bird *bi
effective c++ 條款13:以對象管理
行為 fec ret 拷貝構造函數 AR clas 釋放 AS RR 記住: 為防止資源泄漏,請使用RAII對象,它們在構造函數中獲得資源並在析構函數中釋放資源。 兩個常被使用的RAII類分別是tr1::shared_ptr和auto_ptr。前者通常是較佳選擇,因為其c
effective c++條款17:以獨立語句將newed物件置入智慧指標
假設有這麼一個函式process,它接收一個MyClass型別的指標與 一個函式,如果按下面的方式呼叫: #include <iostream> #include <memory> using namespace std; class MyClass { p
Effective C++ 條款17:以獨立語句將newd的物件放進智慧指標
以獨立語句將new出來的物件儲存於智慧指標內。如果不這樣做,一旦異常被丟擲,有可能導致難以察覺的資源洩露 processWidget(shared_ptr<Widget> (new Widget),priority()); 執行分兩部分: &n
Effective c++ 條款17:以獨立語句將newed 物件置入智慧指標
考慮這樣一個函式和物件: int priority(); void processWidget(std::tr1::shared_ptr<Widget>pw, int priority); 由於謹記“以物件管理資源”的條款,pr
【effective C++】13、以物件來管理資源
1、物件管理資源的必要性 模擬投資行為的程式庫: class Investment{···}; //投資繼承體系中的root class //程式庫利用工廠函式供應給我們特定的Investment物件: //這裡返回的指標指向Investment
effective c++ 條款17:以獨立語句將newd對象置入智能指針
執行 順序 ID 條款17 隱式轉換 ive 遺失 解決 red 記住: 以獨立語句將newd對象存儲於智能指針內。如果不這樣做,一旦異常被拋出,有可能導致難以察覺的資源泄漏。 int priority(); void processWidget(std::tr1::
effective c++條款12:複製物件時勿忘其每一個成分
我們都知道,如果需要,編譯器會為我們自動生成copying函式(拷貝構造與copy assignment操作符)。如果我們想覆蓋它們,只需要自己實現copying函式即可; 但是!!!!!!! 編譯器不樂意了o(╥﹏╥)o:好傢伙,既然你不相信我,那你出了某些錯我可別怪我
Effective C++ 條款12:複製物件時勿忘其每一個成分 學習筆記
Effective C++ 條款12:複製物件時勿忘其每一個成分 <textarea readonly="readonly" nam ="code" class="c++"> void logCall(const string& funcName); c
Effective C++ 條款13 以物件管理資源
// // main.cpp // 條款13:以物件管理資源 // // Created by 於磊 on 2018/7/8. // Copyright © 2018 於磊. All rights reserved. // #include <iostream
effective c++ 條款15:在資源管理類中提供對原始資源的訪問
nth invest AR and effect ptr 比較 c++ 顯示轉換 記住: APIs往往要求訪問原始資源,所以每一個RAII類應該提供一個“取得其所管理之資源”的辦法。 對原始資源的訪問可能經由顯示轉換或隱式轉換。一般而言顯示轉換比較安全,但隱式轉換對客戶比
effective c++條款20:寧以pass-by-reference-to-const替換pass-by-value
1. 更高效 考慮如下的一個base class和derived class: class Base { private: std::string name; std::string address; public: Base(){} ~Base(){}
effective c++條款14:在資源管理類中小心copying行為
對於智慧指標auto_ptr和tr1::shared_ptr,它們在作用域結束時會將所指內容自動刪除。 然而對於某些系統資源,比如互斥鎖(muxex)等並不是在堆中申請的,是長期存在的,只能去釋放,不能將其刪除,這樣,我們就不能用智慧指標去管理它,資源管理類是個好的選擇。 考慮用下面的類
effective c++條款23:寧以non-member non-friend替換member函式
舉書上的例子: class WevBrowser { public: WevBrowser(){} ~WevBrowser(){} public: void ClearCache(); void ClearHistory(); void RemoveC
effective c++條款21:必須返回物件時,別忘想返回其reference
在條款20,我們討論了pass-by-value與pass-by-reference-to-const的傳參效率問題,結果是對於自定義型別,pass-by-reference-to-const方式往往更加高效,那麼我們就會想到,如果返回值也
Effective c++ 條款14:在資源管理類中小心copying行為
並非所有資源都是heap-based,對那種資源而言,像auto-ptr和tr1::shared_ptr這樣的智慧指標往往不適合作為資源掌管者。因此,我們偶爾需要建立自己的資源管理類。 例如,假設我們使用互斥器物件Mutex,共有lock和unloc
Effective c++ 條款20:寧以pass-by-reference-to-const替換pass-by-value
1、預設情況下c++以by value方式傳遞物件至(或來自)函式 除非你另外指定,否則函式引數都是以實際實參的復件(副本)為初值,而呼叫端所獲得的也是函式返回值的一個復件。這些復件由物件的copy建構函式產出,這也可能使得pass-by-value成為
effective c++ 條款06:若不想使用編譯器自動生成的函數,就該明確拒絕
ble 這樣的 ive c++ 拒絕 類對象 析構 並且 防止 記住:為防止編譯器暗自提供的功能,可將相應的成員函數聲明為privae並且不予實現。也可以使用Uncopyable這樣的父類實現。 對於獨一無二的對象,希望不支持拷貝構造函數和賦值操作符。 class Hom
effective c++ 條款07:為多態基類聲明virtual析構函數
pub effective atomic water delet () IV del effect 記住:帶多態性質的基類應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數。class的設計目的如果不是作為基