1 智慧型指標之shared ptr

2021-08-20 13:34:55 字數 2961 閱讀 1000

1.智慧型指標之shared_ptr

1.簡介

shared_ptr( 共享記憶體指標),shared_ptr是乙個共享記憶體的指標,多個指標可以共同使用同乙個物件資源,也就是說多個shared_ptr可以同時「擁有」或者「共享」同乙個物件,當最後乙個地方使用之後會自動釋放相應的記憶體與資源。shared_ptr與其他的智慧型指標一樣都定義在了標頭檔案中。

2. 定義

//這裡的pstr是乙個棧物件,當最後乙個使用之後會自動清理記憶體與資源

shard_ptrpstr(new string(「hello world」);

3. 過載的運算子

所有的智慧型指標都過載了」->」運算子以及「*」,這裡我們需要注意「.」與「->」的區別其中」.」運算子是是呼叫的shared_ptr中的方法,而->則是呼叫指標物件內中的方法,「*」是對其指標進行解引用。

例:

#include #include #include #include using namespace std;

int main()

其中p1.get();返回的是shared_ptr中管理的string*

_ty *get() const _noexcept

注意:當使用(*p1)時返回的是 其中內容的引用,使用pstr->時能夠訪問其中內容的成員。

千萬注意 「.」 和 「->」 的區別

4. 

初始化shared_ptr

該類的建構函式被explicit修飾,所以以下便是錯誤的寫法:

shared_ptrpnico = new string("nico"); // error

shared_ptrpnico; // ok

當然標準庫還提供了乙個專門用於生成shared_ptr的函式,而且使用該方式既快又安全,因為如果使用make_shared只用申請一次記憶體塊,而使用常規的new 操作會先申請記憶體,然後申請記憶體控制。當使用常規的new申請記憶體時,不會立即將裸指標的控制權交給shared_ptr,如果在此時程式丟擲乙個異常,則程式將會出現記憶體洩漏的問題。

當然使用make_shared也會缺點,那就是當配合使用weak_ptr時,因為只分配了一次記憶體,那麼控制塊的記憶體以及物件分配的記憶體則會在一起,當此時如果強引用的計數為0時,按理說此時應該釋放分配的資源,但是此時如果存在weak_ptr的弱引用,那麼將不會立即釋放該資源。 例:

shared_ptrp3 = std::make_shared("abc");
當然shared_ptr 也可以更改其中改的指標內容,但是不能直接new。

例如:

std::shared_ptrpstr(new string(「hello world」));

pstr = new string (「hehehe」);//error

//正確的寫法應該為:

pstr.reset(new string(「lalalal」));//ok

5. use_count

shared_ptr中有乙個名為use_count()的成員函式,呼叫該函式會返回使用該物件的強引用(強引用理解為使用shared_ptr引用就可以)數量,如果該數量返回0時,則證明該物件將不再被使用,將會釋放記憶體與資源。

當然除了use_count 為零外還有另外一種方式可以釋放記憶體,那就是給shared_ptr賦值為nullptr。

6. 自定義刪除器

當使用shard_ptr時,會提供乙個預設的刪除器,但是在某些情況下卻需要我們自己定義刪除器,此時我們會用到shared_ptr建構函式的第二個引數。

例:

shared_ptrpnico(new string("nico"),

(string* p)

);

預設的刪除器只能刪除指標,但是不能刪除陣列。

std::shared_ptrp(new int[10]); //不能這麼寫,但是編譯可以通過
也就是說,如果你要new 陣列,就必須定義自己的刪除器。

例如:

std::shared_ptrpnptr(new int [10],(int *p));
除去自定義刪除器還可以借助unique_ptr提供的乙個工具delete,

例如:

std::shared_ptrpnico(new int[10],

std::default_delete());

shared_ptrp(new int[10]);//這樣宣告會報錯。

std::unique_ptrp(new int[10]); // ok

但是,如果使用unique_ptr宣告刪除器的話就必須給出第二個引數(函式指標)。

例如:

std::unique_ptrp(new int[10],(int* p);
當然也可以定義其他的刪除方式

例://刪除臨時檔案

#include #include // for ofstream

#include // for shared_ptr

#include // for remove()

class filedeleter

void operator () (std::ofstream* fp) };

int main()

如果自定義刪除方式,首先在該類中必須operate();而且這個的函式的引數必須與new的引數一致,而且用該方法可以多乙個建構函式,也就是可以多乙個引數,而remove函式需要檔名這個引數,所以我們建構函式需要將檔名稱傳遞進去,這樣就能關閉該檔案流並將相應的檔案刪除了。

智慧型指標之shared ptr

在智慧型指標中,auto ptr已經使用的越來越少了,特別是在c 11中,它已經被shared ptr取代,原因主要有以下兩點 1.auto ptr不能保留指標所有權 class test test public int m test void fun auto ptrp1 void main 上述...

shared ptr智慧型指標

智慧型指標是乙個行為類似指標的物件。我們在使用堆記憶體時,都需要及時地進行釋放,避免造成記憶體洩漏。但我們偶爾也會忘記將其釋放掉,從而造成記憶體洩漏。並且,在釋放的時候,我們可能對某乙個指標進行了重複釋放,導致程式崩潰的問題。為了能夠解決這些問題,從而有了智慧型指標的設計。智慧型指標一共有四種,分別...

shared ptr(智慧型指標)

只要將 new 運算子返回的指標 p 交給乙個 shared ptr 物件 託管 就不必擔心在 寫delete p語句 實際上根本不需要編寫這條語句,託管 p 的 shared ptr 物件在消亡時會自動執行delete p。而且,該 shared ptr 物件能像指標 p 樣使用,即假設託管 p ...