您好,登錄后才能下訂單哦!
RAII:資源分配即初始化,利用構造函數和析構函數定義一個類來完成對資源的分配和釋放
智能指針主要用來防止內存泄漏,我們來舉個栗子,看看為什么會有智能指針這個東東
例1:
對于上面這段程序,由于拋出異常的時候影響了代碼的執行流,所以要在異常捕獲之前將p提前釋放(詳見
我的博客:C++的異常淺析),雖然可以通過再次拋出以異常解決這個問題,但是在代碼美觀方面不夠完
美,更重要的是如果在代碼量非常大,而且在多處有動態開辟出來的空間的時候,僅僅通過再次拋出異常已
經遠遠不夠解決這個問題了,會使得工作量大大加大,那么有沒有什么辦法可以解決這種問題,而且不增加
工作量呢?
此刻就輪到我們的智能指針出場啦
首先我們先來認識五種智能指針
autoptr:管理權的轉移(最好不要使用,比較雞肋)
scoped ptr:強制防拷貝(針對和指針)
scoped array:強制防拷貝(針對數組)
shared ptr:引用計數,通過增減計數器來管理,最后一個對象釋放(針對指針)
shared array:同上,針對數組
第一個先來看看autoptr類的實現
在我們剛開始學C++的時候可以知道當一個對象出了其作用域,就會自動調用她的析構函數,而智能指針正
是利用了這個原理,在用智能指針構造對象的時候就會自動調用析構函數,這樣就不會發生內存泄漏的問題
了。
那么問題又來了,智能指針本身并不是一個真正意義上的指針,而是一種“仿造”的指針,所以為了使它看
起來更像指針,就要對它的*和->進行一次重載,這樣看起來就更像指針啦
。
接下來要介紹的幾種智能指針相比autoptr會更實用一些,但是他們都屬于boost庫中的庫函數,需要下載后
才能直接使用哦,我們來看一下它的類的實現
可以看出,為了防止拷貝,scopedptr的類在實現的時候將她的拷貝構造和賦值符重載聲明在了protected
中,這樣是為了防止有人惡意從外部對其進行實現。
記住防拷貝的兩個條件:①只聲明,不實現
②聲明成保護或私有
而和scopedptr很相似的scoped array,實現的機制和scopedptr是很像的,只不過在訪問它的內部成員時,
既不需要很麻煩了,只需要重載一下[ ],就可以很容易訪問了。
最后我們再來看看sharedptr,在前面我們學過寫時拷貝,同樣也是利用了引入計數器,所以在這里就不是
很難理解了,在它的類里面多了一個成員_pcount,表示指向當前對象的指針的個數,這樣可以直觀的理解
sharedptr的實現機制了
現在就剩下sharedarray了,和sharedptr一樣,只需要重載它的[ ],其余的就和sharedptr差不多了
通過上面的簡單介紹,相信大家對智能指針也有一定的了解了,既然智能指針這么好用,后面的編程肯定會
有很多地方用到它,所以掌握它們的用法是很重要的咯。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。