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

来源:http://www.cnblogs.com/eversteins/archive/2017/01/04/6249956.html
-Advertisement-
Play Games

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

-Advertisement-
Play Games
更多相關文章
  • 什麼是Servlet?① Servlet就是JAVA 類② Servlet是一個繼承HttpServlet類的類③ 這個在伺服器端運行,用以處理客戶端的請求 Servlet相關包的介紹--javax.servlet.* :存放與HTTP 協議無關的一般性Servlet 類;--javax.servl ...
  • 直接插入排序是將一個記錄插入到已經排好序的有序表中,從而得到一個新的記錄數加1的有序表。 下麵的代碼中會先假設數組的第一個元素是已經拍好序的有序表,然後從第二個元素開始遍歷剩下的元素。 所以呢,第一個for迴圈是遍歷待插入的元素,第二個for迴圈是遍歷被插入的有序表,並將待插入元素與有序表的元素比較 ...
  • 參考 http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 問題:bash怎麼提取字元串的最後一位?例如python中string[-1]就是python字元串最後一位。 echo ${PATH:((${#PATH} - 1)) ...
  • RSA.h #ifndef _RSA_H #define _RSA_H #include #include #include /* 密鑰產生: 1.隨機選定兩個大素數p, q. 2.計算公鑰和私鑰的公共模數 n = pq . 3.計算模數n的歐拉函數 φ(n) . 4.選定一個正整數e, 使1 e,... ...
  • SHA-1.cpp TEST.cpp ...
  • if __name__== "__main__" 的意思(作用)python代碼復用 轉自:大步's Blog http://www.dabu.info/if-__-namelxx_-main__-mean-function-python-code-reuse.html 有人在學習python腳本時 ...
  • Java是最早開始有併發的語言之一,再過去傳統多任務的模式下,人們發現很難解決一些更為複雜的問題,這個時候我們就有了併發. 引用 & 160; & 160; & 160; & 160;多線程比多任務更加有挑戰。多線程是在同一個程式內部並行執行,因此會對相同的記憶體空間進行併發讀寫操作。這可能是在單線程 ...
  • 本文由博主原創,轉載請註明出處:我的博客-知乎爬蟲之爬蟲流程設計 git爬蟲項目地址(關註和star在哪裡~~):https://github.com/MatrixSeven/ZhihuSpider (已完結) 附贈之前爬取的數據一份(mysql): 鏈接:https://github.com/Ma ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...