1. 程式人生 > >enote筆記法使用範例(2)——指標(1)智慧指標

enote筆記法使用範例(2)——指標(1)智慧指標

要知道什麼是智慧指標,首先了解什麼稱為 “資源分配即初始化” whatRAII:RAII—Resource Acquisition Is Initialization,即“資源分配即初始化” 在《C++ Primer》這樣解釋的,“通過定義一個類來封裝資源的分配和釋放,可以保證正確釋放資源” 核心:C++98提供了語言機制:物件(【!值語意物件】)在超出作用域,,解構函式會被自動呼叫 【如果建構函式中丟擲異常,則不會呼叫解構函式。只有建構函式正確地執行,構建物件成功,才會呼叫解構函式】 《Linux多執行緒服務端程式設計》p20: “我認為RAII是C++語言區別於其他所有程式語言的最重要的特性,一個不懂RAII的程式設計師不是一格的程式設計師”個合 “每一個明確的資源配置動作(例如new)都應該在單一語句中執行,並在該語句中立刻將配置獲得的資源交給handle物件(如shared_ptr),程式中一般不出現delete” “shared_ptr是管理共享資源的利器,需要注意避免迴圈引用,通常的做法是owner持續指向child的shared_ptr,child持有指向owner的weak_ptr” p15“在現代的C++程式中一般不會出現delete語句,資源(包括複雜物件本身)都是通過物件(智慧指標或容器)來管理的,不需要程式設計師還為此操心” why
 RAII
:1)防止資源洩露(【注意是“資源”,不止是記憶體】),以及防止其他資源管理問題(比如在記憶體管理中:野指標,重複釋放等問題) (轉劉未鵬blog:如何確保資源一定會被釋放(即便發生異常),這在D裡面對應的是scope(exit),在Java裡面對應的是finally,在C#裡面對應的是scoped using。簡而言之就是,不管當前作用域以何種方式退出,某某操作(通常是資源釋放)都一定要被執行。) 當需要釋放的資源有多個的時候,RAII的真正強大之處才被展現出來,一般地說,如果一個函式依次申請N個資源                        2)異常安全的一部分 why 智慧指標
記憶體管理:c++需要程式設計師手動管理記憶體,new、delete仍不能保證記憶體不洩露。並且能一定程度地避免物件狀態的破壞,見《effective c++》Item29 when: new和delete之間:
1)return 2)delete在迴圈中,前面有continue,goto,break 3)異常(程式碼中丟擲異常;呼叫了丟擲異常的函式;巢狀地呼叫了丟擲異常的函式) 【how:要用new時必須小心翼翼(當然c++的new是個好東西,因為我不願放棄對系統的控制;不能像c#,java一樣毫無顧忌           c、c++畢竟只是時代的過渡品。。。            1)要寫new和delete,a)首先要成對編寫;其次,b)確保new與delete之間不會出現上述3種情況。             2)要考慮未來的你,你修改別人的程式碼,別人修改你的程式碼。when
所以加return,continue,goto,break,或呼叫函式(只有呼叫函式就可能丟擲異常),都要考慮可能出現資源管理的問題】 what智慧指標:智慧指標是“RAII"技術的實現。 智慧指標的核心概念:《Effective C++》給出的關鍵特點是: 1)資源分配立即資源管理物件接管。 2)資源管理物件<<通過>>解構函式來確保正確資源釋放。 《More Effective C++》中這樣描述的:“Smart pointers are objects that are designed to look,act,and feel like build-in pointers,but to offer greater functionality.They have a variety of applications, including resource management,以及自動的重複寫碼工作” 智慧指標實現上的特點:所有權轉移,所有權獨佔,引用計數
《effective c++》p67
what引用計數: 有時候我們希望保有資源,when直到它的最後一個使用者(某物件)被銷燬。這種情況下複製RAII物件時,應該將資源的“被引用數”遞增。





----------------------------------------------------------------------------------

再發兩張截圖的jpg版本:



-----------------------------------------------------------------------

備註:這裡的所有內容全部都是我的原創,本文的版權歸EverSteins所有,抄襲必究。