raii:資源分配即初始化,利用建構函式和析構函式定義乙個類來完成對資源的分配和釋放
智慧型指標主要用來防止記憶體洩漏,我們來舉個栗子,看看為什麼會有智慧型指標這個東東
例1:
對於上面這段程式,由於丟擲異常的時候影響了**的執行流,所以要在異常捕獲之前將p提前釋放(詳見
我的部落格:c++的異常**),雖然可以通過再次丟擲以異常解決這個問題,但是在**美觀方面不夠完
美,更重要的是如果在**量非常大,而且在多處有動態開闢出來的空間的時候,僅僅通過再次丟擲異常已
經遠遠不夠解決這個問題了,會使得工作量大大加大,那麼有沒有什麼辦法可以解決這種問題,而且不增加
工作量呢?
此刻就輪到我們的智慧型指標出場啦
首先我們先來認識五種智慧型指標
autoptr:管理權的轉移(最好不要使用,比較雞肋)
scoped ptr:強制防拷貝(針對和指標)
scoped array:強制防拷貝(針對陣列)
shared ptr:引用計數,通過增減計數器來管理,最後乙個物件釋放(針對指標)
shared array:同上,針對陣列
第乙個先來看看autoptr類的實現
在我們剛開始學c++的時候可以知道當乙個物件出了其作用域,就會自動呼叫她的析構函式,而智慧型指標正
是利用了這個原理,在用智慧型指標構造物件的時候就會自動呼叫析構函式,這樣就不會發生記憶體洩漏的問題
了。那麼問題又來了,智慧型指標本身並不是乙個真正意義上的指標,而是一種「仿造」的指標,所以為了使它看
起來更像指標,就要對它的*和->進行一次過載,這樣看起來就更像指標啦
才能直接使用哦,我們來看一下它的類的實現
可以看出,為了防止拷貝,scopedptr的類在實現的時候將她的拷貝構造和賦值符過載宣告在了protected
中,這樣是為了防止有人惡意從外部對其進行實現。
記住防拷貝的兩個條件:①只宣告,不實現
②宣告成保護或私有
而和scopedptr很相似的scoped array,實現的機制和scopedptr是很像的,只不過在訪問它的內部成員時,
既不需要很麻煩了,只需要過載一下[ ],就可以很容易訪問了。
最後我們再來看看sharedptr,在前面我們學過寫時拷貝,同樣也是利用了引入計數器,所以在這裡就不是
很難理解了,在它的類裡面多了乙個成員_pcount,表示指向當前物件的指標的個數,這樣可以直觀的理解
sharedptr的實現機制了
現在就剩下sharedarray了,和sharedptr一樣,只需要過載它的[ ],其餘的就和sharedptr差不多了
通過上面的簡單介紹,相信大家對智慧型指標也有一定的了解了,既然智慧型指標這麼好用,後面的程式設計肯定會
有很多地方用到它,所以掌握它們的用法是很重要的咯。
RAII 智慧型指標
智慧型指標是c 中為了實現資源的有效管理而被提出的,我們可以建立它但無須操心它的釋放問題,在引入異常機制的程式裡它是十分有用的,或者說,對於博主這中粗心大意的人來說還是可以偶爾使用的。他可以在一些場合防止記憶體洩漏的問題。但是,智慧型指標也是存在著許多的問題,所以許多的程式設計規範裡告誡我們少使用智...
智慧型指標小結
智慧型指標的存在是為了巧妙的解決程式設計過程中資源洩露的問題,利用了棧的特性,出棧之後物件會自動析構的特點來對資源進行有效的釋放。主要存在的有兩大類智慧型指標,帶引用計數的智慧型指標和不帶引用技術的智慧型指標 不帶引用的智慧型指標 auto ptr scoped ptr unique ptr 以及帶...
C 智慧型指標用法小結
智慧型指標的出現,讓很多記憶體洩漏的隱患降低了不少,但是本人真的非常非常不推薦大面積鋪開使用智慧型指標這個東西,這個東西一是效能不如老老實實new delete,而且一旦沒用用好,反而適得其反。但是畢竟智慧型指標也是很多人在用,作為複習進行一下小結。已經完全可以淘汰的auto ptr就不說了,沒人會...