要知道什麼是智能指針,首先瞭解什麼稱為 “資源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“資源分配即初始化” 在《C++ Primer》這樣解釋的,“通過定義一個類來封裝資源的分配和釋放,可以保證正確釋放資源” 核心 ...
要知道什麼是智能指針,首先瞭解什麼稱為 “資源分配即初始化” what RAII: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時必須小心翼翼(
《effective c++》p67 what 引用計數: 有時候我們希望保有資源,when直到它的最後一個使用者(某對象)被銷毀。這種情況下複製RAII對象時,應該將資源的“被引用數”遞增。
以上,版權歸作者所有,任何形式轉載請聯繫作者。 -------------------------------------------------------------------------- 再發兩張截屏的jpg版本: --------------------------------------------------------------------------
備註:這裡的所有內容全部都是我的原創,本文的版權歸EverSteins所有,抄襲必究。