RAII:資源分配即初始化,利用構(gòu)造函數(shù)和析構(gòu)函數(shù)定義一個類來完成對資源的分配和釋放
10年積累的成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有桑植免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
智能指針主要用來防止內(nèi)存泄漏,我們來舉個栗子,看看為什么會有智能指針這個東東
例1:
對于上面這段程序,由于拋出異常的時候影響了代碼的執(zhí)行流,所以要在異常捕獲之前將p提前釋放(詳見
我的博客:C++的異常淺析),雖然可以通過再次拋出以異常解決這個問題,但是在代碼美觀方面不夠完
美,更重要的是如果在代碼量非常大,而且在多處有動態(tài)開辟出來的空間的時候,僅僅通過再次拋出異常已
經(jīng)遠遠不夠解決這個問題了,會使得工作量大大加大,那么有沒有什么辦法可以解決這種問題,而且不增加
工作量呢?
此刻就輪到我們的智能指針出場啦
首先我們先來認識五種智能指針
autoptr:管理權(quán)的轉(zhuǎn)移(最好不要使用,比較雞肋)
scoped ptr:強制防拷貝(針對和指針)
scoped array:強制防拷貝(針對數(shù)組)
shared ptr:引用計數(shù),通過增減計數(shù)器來管理,最后一個對象釋放(針對指針)
shared array:同上,針對數(shù)組
第一個先來看看autoptr類的實現(xiàn)
在我們剛開始學C++的時候可以知道當一個對象出了其作用域,就會自動調(diào)用她的析構(gòu)函數(shù),而智能指針正
是利用了這個原理,在用智能指針構(gòu)造對象的時候就會自動調(diào)用析構(gòu)函數(shù),這樣就不會發(fā)生內(nèi)存泄漏的問題
了。
那么問題又來了,智能指針本身并不是一個真正意義上的指針,而是一種“仿造”的指針,所以為了使它看
起來更像指針,就要對它的*和->進行一次重載,這樣看起來就更像指針啦
。
接下來要介紹的幾種智能指針相比autoptr會更實用一些,但是他們都屬于boost庫中的庫函數(shù),需要下載后
才能直接使用哦,我們來看一下它的類的實現(xiàn)
可以看出,為了防止拷貝,scopedptr的類在實現(xiàn)的時候?qū)⑺目截悩?gòu)造和賦值符重載聲明在了protected
中,這樣是為了防止有人惡意從外部對其進行實現(xiàn)。
記住防拷貝的兩個條件:①只聲明,不實現(xiàn)
②聲明成保護或私有
而和scopedptr很相似的scoped array,實現(xiàn)的機制和scopedptr是很像的,只不過在訪問它的內(nèi)部成員時,
既不需要很麻煩了,只需要重載一下[ ],就可以很容易訪問了。
最后我們再來看看sharedptr,在前面我們學過寫時拷貝,同樣也是利用了引入計數(shù)器,所以在這里就不是
很難理解了,在它的類里面多了一個成員_pcount,表示指向當前對象的指針的個數(shù),這樣可以直觀的理解
sharedptr的實現(xiàn)機制了
現(xiàn)在就剩下sharedarray了,和sharedptr一樣,只需要重載它的[ ],其余的就和sharedptr差不多了
通過上面的簡單介紹,相信大家對智能指針也有一定的了解了,既然智能指針這么好用,后面的編程肯定會
有很多地方用到它,所以掌握它們的用法是很重要的咯。