enote筆記法使用範例(2)——指標(1)智慧指標
阿新 • • 發佈:2019-02-17
要知道什麼是智慧指標,首先了解什麼稱為 “資源分配即初始化”
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物件時,應該將資源的“被引用數”遞增。
1)return 2)delete在迴圈中,前面有continue,goto,break 3)異常(程式碼中丟擲異常;呼叫了丟擲異常的函式;巢狀地呼叫了丟擲異常的函式) 【how:要用new時必須小心翼翼(
《effective c++》p67
what引用計數: 有時候我們希望保有資源,when直到它的最後一個使用者(某物件)被銷燬。這種情況下複製RAII物件時,應該將資源的“被引用數”遞增。
----------------------------------------------------------------------------------
再發兩張截圖的jpg版本:-----------------------------------------------------------------------
備註:這裡的所有內容全部都是我的原創,本文的版權歸EverSteins所有,抄襲必究。