C 11智慧型指標之weak ptr詳解

2022-09-29 15:51:17 字數 2518 閱讀 1205

如題,我們今天要講的是 c++11 引入的三種智慧型指標中的:weak_ptr。

在學習 weak_ptr 之前最好對 shared_ptr 有所了解。如果你還不知道 shared_ptr 是何物,可以看看另一篇文章:

【c++11新特性】 c++11智慧型指標之shared_ptr

1、為什麼需要weak_ptr?

在正式介紹weak_ptr之前,我們先來回憶一下shared_ptr的一些知識。

我們知道shared_ptr是採用引用計數的智慧型指標,多個shared_ptr例項可以指向同乙個動態物件,並維護了乙個共享的引用計數器。

對於引用計數法實現的計數,總是避免不了迴圈引用(或環形引用)的問題,shared_ptr也不例外。

我們先來看看下面這個例子:

#include

#include

#include www.cppcns.comor>

using namespace std;

class classb;

class程式設計客棧 classa

~classa()

shared_ptr pb; // 在a中引用b

};class classb

~classb()

shared_ptr pa; // 在b中引用a

};int main()

上面**的輸出如下:

classa constructor...

classb constructor...

program ended with exit code: 0

從上面**中,classa和classb間存在著迴圈引用,從執行結果中我們可以看到:當main函式執行結束後,spa和spb管理的動態資源並沒有得到釋放,產生了記憶體洩露。

為了解決類似這樣的問題,c++11引入了weak_ptr,來打破這種迴圈引用。

2程式設計客棧、weak_ptr是什麼?

weak_ptr 是為了配合 shared_ptr 而引入的一種智慧型指標,它指向乙個由 shared_ptr 管理的物件而不影響所指物件的生命週期,也就是將乙個 weak_ptr 繫結到乙個 shared_ptr 不會改變 shared_ptr 的引用計數。

不論是否有 weak_ptr 指向,一旦最後乙個指向物件的 shared_ptr 被銷毀,物件就會被釋放。

從這個角度看,weak_ptr更像是shared_ptr的乙個助手而不是智慧型指標。

3、weak_ptr如何使用?

接下來,我們來看看weak_ptr的簡單用法。

3.1如何建立weak_ptr例項

當我們建立乙個weak_ptr時,需要用乙個 shared_ptr 例項來初始化 weak_ptr,由於是弱共享,weak_ptr 的建立並不會影響 shared_ptr 的引用計數值。

示例:int main()

3.2如何判斷weak_ptr指向物件是否存在

既然weak_ptr並不改變其所共享的shared_ptr例項的引用計數,那就可能存在weak_ptr指向的物件被釋放掉這種情況。

這時,我們就不能使用weak_ptr直接訪問物件。那麼我們如何判斷weak_ptr指向物件是否存在呢?

c++中提供了lock函式來實現該功能。

如果物件存在,lock()函式返回乙個指向共享物件的shared_ptr,否則返回乙個空shared_ptr。

示例:class a

~a()

int a;

};int main()

else

}試試把sp.reset()這行的注釋去掉看看結果有什麼不同。

除此之外,weak_ptr還提供了expired()函式來判斷所指物件是否已經被銷毀。

示例:class a

~a()

int a;

};int main()

**輸入如下:

a constructor...

a destructor...

13.3如何使用weak_ptr

weak_ptr並沒有過載 operator->和 operator *操作符,因此不可直接通過weak_ptr使用物件,典型的用法是呼叫其lock函式來獲得shared_ptr示例,進而訪問原始物件。

最後,我們來看看如何使用weak_ptr來改造最前面的**,打破迴圈引用問題。

class classb;

classa

~classa()

weak_ptr pb; // 在a中引用b

};class classb

~classb()

weak_ptr pa; // 在b中引用a

};int main()

輸出結果如下:

classa constructor...

classb constructor...

classa destructor...

classb destructor...

program ended with exit code: 0

從執行結果可以看到spa和spb指向的物件都得到釋放!

總結

C 11 智慧型指標 二 weak ptr

weak ptr是一種不控制所指向物件生存期的智慧型指標,它指向乙個由shared ptr管理的物件。將乙個weak ptr繫結到乙個shared ptr不會改變它的引用計數。一旦最後乙個指向某個物件的shared ptr被銷毀,物件就會被釋放,即使weak ptr指向該物件,該物件也會被釋放。we...

C 11 weak ptr智慧型指標

和 shared ptr unique ptr 型別指標一樣,weak ptr 智慧型指標也是以模板類的方式實現的。weak ptr t 為指標所指資料的型別 定義在標頭檔案,並位於 std 命名空間中。因此,要想使用 weak ptr 型別指標,程式中應首先包含如下 2 條語句 include u...

C 11之智慧型指標

c 98提供了了智慧型指標auto ptr,但c 11已將其摒棄,並提供了unique ptr和shared ptr。這三種智慧型指標模板都定義了類似指標的物件,可以將new獲得的位址賦給這種物件。當智慧型指標過期時,這些記憶體將自動被釋放。其基本用法如下 include include inclu...