由於在c++中我們可以動態分配記憶體,但有時候我們會忘記用
delete或free釋放記憶體,就會導致記憶體洩露。所以c++11提供了智慧型指標這種東西
本文參考了知乎某知乎友的
比如下面這兩種情況
//1 記憶體洩漏 str1所指的資源沒有被釋放可能平時都寫在乙個檔案不會忘記釋放記憶體,但如果是乙個大的專案就出問題了//2 多重釋放,引起程式崩潰
然後是智慧型指標的賦值方式和普通指標有差異
可以在定義時就可以動態分配記憶體單元,但不允許先定義智慧型指標,再為其動態分配記憶體空間
再然後普通指標和智慧型指標之間的賦值也得很注意,
不能把智慧型指標指向普通記憶體變數,或者把非智慧型指標賦值給智慧型指標。
但可以把智慧型指標賦值給普通指標,但不是那麼直接,需要通過智慧型指標的get()成員函式獲取智慧型指標中的指標後
再賦值給普通指標
1.先說一下auto_prt是c++98標準定義的獨佔智慧型指標,這意味著
乙個物件只能被乙個auto_prt指向,兩個同型別的auto_ptr不能指向同乙個物件
指標的賦值或複製操作會改變物件所有權,被複製的auto_prt不再指向任何物件
執行是會有警告,
因為c++11不推薦使用auto_ptr,提出了unique_ptr來代替,用途和auto_ptr相同
但c++11禁止unique_ptr之間的賦值,也不允許使用乙個unique_ptr初始化其他指標,否則會出現編譯錯誤
比如
int main()下面再來說shared_ptr它是一種共享指標,也就是說多個指標可以同時指向乙個物件。c++11允許shared_ptr指標之間的賦值,也允許使用乙個智慧型指標初始化其他指標
再看原理分析
1.當從堆上申請了乙個資源時,我們就建立乙個智慧型指標物件,使它指向這個資源,同時,
在堆上申請乙個用於計數的資源,讓後來所有的指向該資源的物件都共享這個計數資源,這樣,引用計數的個數就只有乙份。
2.當將ptr1物件賦值給物件ptr2時,其共享的引用計數變為2。
3.刪除ptr2物件時,其對應的引用計數減為1。
4.刪除ptr1物件時,引用計數變為0,則釋放資源。
首先,智慧型指標是乙個類,這樣就可以使用建構函式和析構函式對引用計數進行維護;
其次,它要表現出指標的行為,並且使用起來也要像普通指標一樣;
最後,智慧型指針對任何型別都可以使用,所以它應該是乙個模板。
具體實現看知乎原文吧
我們看乙個應用例子把,實現兩個數交換
上面的**我們多次用了new動態分配記憶體空間,但我們並沒有delete過,
由於shared_ptr的存在,它會自動**,就不會造成記憶體洩露
同時c++11還提供了乙個配合shared_ptr使用的弱智能指標weak_ptr,
用於解決兩個shared_ptr指標應用之間的迴圈計數問題。這個我不敢看了後面再補吧
C 11之智慧型指標
c 98提供了了智慧型指標auto ptr,但c 11已將其摒棄,並提供了unique ptr和shared ptr。這三種智慧型指標模板都定義了類似指標的物件,可以將new獲得的位址賦給這種物件。當智慧型指標過期時,這些記憶體將自動被釋放。其基本用法如下 include include inclu...
C 11智慧型指標
本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...
c 11 智慧型指標
如果在程式中使用new從堆 自由儲存區 分配記憶體,等到不需要時,應使用delete將其釋放。c 引入了智慧型指標auto ptr,以幫助自動完成這個過程。c 11摒棄了auto ptr,並新增了三種智慧型指標 unique ptr,shared ptr,weak ptr。一.auto ptr,un...