c 11之智慧型指標

2022-07-13 19:33:15 字數 2122 閱讀 2288

由於在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...