Effective C++讀書筆記---資源管理

所謂資源就是,一旦用了它,將來必須還給系統。如果不這樣,槽糕的事情就會發生。C++程序中最常用的資源就是動態分配內存,還包括文件描述器(file descriptors)、互斥鎖(mutex locks)、圖形界面中的字形和筆刷、數據庫連接、以及網絡sockets。不論哪種,當你不再使用時,必須將它還給系統
十三、條款13-以對象管理資源
1.爲防止資源泄漏,請使用RAII(“以對象管理資源”的觀念常被稱爲“資源取得時機便是初始化時機”[Resource Acquisition Is Initialization;RAII]),它們在構造函數中獲得資源並在析構函數中釋放資源
2.兩個常被使用的RAII classes分別是tr1::shared_ptr和auto_ptr。前者通常是較佳選擇,因爲其copy行爲比較直觀。若選擇auto_ptr,複製動作會使它(被複制物)指向NULL
3.auto_ptr和tr1::shared_ptr兩者都在其析構函數內做delete而不是delete[]動作。那意味着動態分配而得的array身上使用auto_ptr或tr1::shared_ptr是個餿主意。不過可以瞭解boost::scoped_array和boost::shared_array classes
十四、條款14-在資源管理類中小心copying行爲
1.對於非heap-based的資源而言,像auto_ptr和tr1::shared_ptr這樣的智能指針往往不適合作爲資源掌管者(resource handlers)
2.當一個RAII被複制,會發生什麼事?常見的RAII class copying 行爲:
[1]禁止複製
[2]對底層資源祭出“引用計數法”(reference-count)
[3]複製底部資源
[4]轉移底部資源的擁有權
十五、條款15-在資源管理類中提供對原始資源的訪問
1.APIs往往要求訪問原始資源(raw resources),所以每一個RAII class應該提供一個“取得其所管理之資源”的辦法
2.可以顯示(如get())或隱式(operator raw_resource_class_name() const )進行轉換,一般顯式比較安全,但隱式對客戶又比較方便
十六、條款16-成對使用new和delete時要採用相同形式
1.如果你在new表達式中使用[],必須在相應的delete表達式中也使用[]。如果你在new表達式中不使用[],一定不要在相應的delete表達式中使用[]
十七、條款17-以獨立語句將newed對象置入智能指針
1.以獨立語句將newed對象置入智能指針。如果不這樣,一旦異常被拋出,有可能導致難以察覺得資源泄漏
不要使用
callFun( std::tr1::shared_ptr<TestClass>(new TestClass), otherFun() );
因爲編譯器可能選擇的執行順位是 new TestClass-->otherFun()-->tr1::shared_ptr構造函數,因爲編譯器覺得這樣的選擇可能可以生成更高效的代碼,誰知道呢?
但如果otherFun()調用導致異常,會怎麼樣呢?
所以使用分離語句
std::tr1::shared_ptr<TestClass> pT(new TextClass );
callFun( pT, otherFun() );
這樣就不會因爲otherFun()可能拋出異常而導致資源泄漏

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