程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> enote筆記法使用范例(2)——指針(1)智能指針,enote范例

enote筆記法使用范例(2)——指針(1)智能指針,enote范例

編輯:C++入門知識

enote筆記法使用范例(2)——指針(1)智能指針,enote范例


要知道什麼是智能指針,首先了解什麼稱為 “資源分配即初始化” 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時必須小心翼翼(當然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所有,抄襲必究。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved