91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++的RAII和智能指針小結

發布時間:2020-08-23 01:54:53 來源:網絡 閱讀:693 作者:福大馨 欄目:編程語言


RAII:資源分配即初始化,利用構造函數和析構函數定義一個類來完成對資源的分配和釋放

智能指針主要用來防止內存泄漏,我們來舉個栗子,看看為什么會有智能指針這個東東

例1:

C++的RAII和智能指針小結

對于上面這段程序,由于拋出異常的時候影響了代碼的執行流,所以要在異常捕獲之前將p提前釋放(詳見

我的博客:C++的異常淺析),雖然可以通過再次拋出以異常解決這個問題,但是在代碼美觀方面不夠完

美,更重要的是如果在代碼量非常大,而且在多處有動態開辟出來的空間的時候,僅僅通過再次拋出異常已

經遠遠不夠解決這個問題了,會使得工作量大大加大,那么有沒有什么辦法可以解決這種問題,而且不增加

工作量呢?

此刻就輪到我們的智能指針出場啦

首先我們先來認識五種智能指針

autoptr:管理權的轉移(最好不要使用,比較雞肋)

scoped ptr:強制防拷貝(針對和指針)

scoped array:強制防拷貝(針對數組)

shared ptr:引用計數,通過增減計數器來管理,最后一個對象釋放(針對指針)

shared array:同上,針對數組

第一個先來看看autoptr類的實現

C++的RAII和智能指針小結C++的RAII和智能指針小結C++的RAII和智能指針小結

C++的RAII和智能指針小結

在我們剛開始學C++的時候可以知道當一個對象出了其作用域,就會自動調用她的析構函數,而智能指針正

是利用了這個原理,在用智能指針構造對象的時候就會自動調用析構函數,這樣就不會發生內存泄漏的問題

了。

那么問題又來了,智能指針本身并不是一個真正意義上的指針,而是一種“仿造”的指針,所以為了使它看

起來更像指針,就要對它的*和->進行一次重載,這樣看起來就更像指針啦

接下來要介紹的幾種智能指針相比autoptr會更實用一些,但是他們都屬于boost庫中的庫函數,需要下載后

才能直接使用哦,我們來看一下它的類的實現

C++的RAII和智能指針小結

C++的RAII和智能指針小結

可以看出,為了防止拷貝,scopedptr的類在實現的時候將她的拷貝構造和賦值符重載聲明在了protected

中,這樣是為了防止有人惡意從外部對其進行實現。


記住防拷貝的兩個條件:①只聲明,不實現

              ②聲明成保護或私有

而和scopedptr很相似的scoped array,實現的機制和scopedptr是很像的,只不過在訪問它的內部成員時,

既不需要很麻煩了,只需要重載一下[ ],就可以很容易訪問了。


C++的RAII和智能指針小結C++的RAII和智能指針小結


最后我們再來看看sharedptr,在前面我們學過寫時拷貝,同樣也是利用了引入計數器,所以在這里就不是

很難理解了,在它的類里面多了一個成員_pcount,表示指向當前對象的指針的個數,這樣可以直觀的理解

sharedptr的實現機制了



C++的RAII和智能指針小結C++的RAII和智能指針小結

C++的RAII和智能指針小結

C++的RAII和智能指針小結

現在就剩下sharedarray了,和sharedptr一樣,只需要重載它的[ ],其余的就和sharedptr差不多了

C++的RAII和智能指針小結C++的RAII和智能指針小結

C++的RAII和智能指針小結

 C++的RAII和智能指針小結

通過上面的簡單介紹,相信大家對智能指針也有一定的了解了,既然智能指針這么好用,后面的編程肯定會

有很多地方用到它,所以掌握它們的用法是很重要的咯。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台中市| 海宁市| 林西县| 湘阴县| 改则县| 远安县| 台前县| 烟台市| 新建县| 四子王旗| 高雄县| 玛多县| 永平县| 利津县| 油尖旺区| 揭阳市| 大姚县| 抚宁县| 磴口县| 读书| 清苑县| 翼城县| 芮城县| 蒲城县| 盐源县| 诏安县| 二手房| 紫金县| 永和县| 正安县| 依兰县| 会理县| 基隆市| 浮梁县| 丹巴县| 灯塔市| 团风县| 岑巩县| 岢岚县| 丹东市| 巫山县|