《Effective C++讀書筆記》--條款13:以對象管理資源

對於剛接觸C++程序員來說,內存泄漏可能是最常遇到的會導致程序崩潰的問題。程序員自己管理內存和資源是一把雙刃劍,用的好會使程序效率大大提高,用的不好便會造成一系列諸如內存泄漏,程序崩潰的致命問題。除了最常用的分配內存,還有許多需要管理的資源,包括文件描述器、數據庫連接、互斥鎖、圖形界面中的畫筆,網絡socket等等。由於異常、函數體內的多個return(在釋放資源前程序就退出),程序改動時沒充分考慮資源管理等種種原因,使得我們再小心也會出現沒有正確釋放資源的錯誤。對此,我們需要以對象來管理資源。

--爲了確保資源能正確釋放,我們需要將資源放進對象中,當函數退出時,該對象的析構函數會自動釋放那些資源。

對於管理資源的對象,我們有智能指針,常用的智能指針有std::auto_ptr,std::tr1::shared_ptr...#TODO,每個指針都有其特點,接下來我們具體分析.

--std::auto_ptr:auto_ptr被銷燬時會自動刪除其所指的對象,如果多個auto_ptr指向同一個對象,那麼對象會被刪除多次,從而導致UB,對此,auto_ptr若通過拷貝構造函數或賦值操作符複製他們,那麼他們會變成null,複製所得的指針將取得資源的唯一所有權。由於這個原因,STL容易不可以由auto_ptr所管理。

--std::tr1::shared_ptr:由於auto_ptr存在的問題,它並不能很好的管理資源,因此我們引入了引用計數型智能指針,通過計數的方式追蹤有多少對象指向某一資源,並且在無人指向時自動刪除該資源,由於該特性,tr1::shared_ptr的複製行爲就正常很多,因此可被用於STL容器中,但該指針也有一個問題就是無法打破環狀引用,比如兩個沒被使用的對象互指,表現爲好像還處在被使用的狀態。

以上兩者在析構函數內執行的動作都是delete而非delete[],如果對於一個數組,delete僅刪除了其中第一者的指針,因此我們不可以在動態分配的array上使用auto_ptr或者shared_ptr。最後,如果一個函數返回一個未加工的指針,我們極容易會忘記在該指針上使用delete,因此我們最好對接口進行修改。


發佈了73 篇原創文章 · 獲贊 15 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章