C 11 weak ptr智慧型指標

2022-09-23 14:42:09 字數 2275 閱讀 3244

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

#include

using namespace std;

第 2 句並不是必須的,可以不新增,則後續在使用 unique_ptr 指標時,必須標註std::

需要注意的是,c++11標準雖然將 weak_ptr 定位為智慧型指標的一種,但該型別指標通常不單獨使用(沒有實際用處),只能和 shared_ptr 型別指標搭配使用。甚至於,我們可以將 weak_ptr 型別指標視為 shared_ptr 指標的一種輔助工具,借助 weak_ptr 型別指標, 我們可以獲取 shared_ptr 指標的一些狀態資訊,比如有多少指向相同的 shared_ptr 指標、shared_ptr 指標指向的堆記憶體是否已經被釋放等等。

需要注意的是,當 weak_ptr 型別指標的指向和某一 shared_ptr 指標相同時,weak_ptr 指標並不會使所指堆記憶體的引用計數加 1;同樣,當 weak_ptr 指標被釋放時,之前所指堆記憶體的引用計數也不會因此而減 1。也就是說,weak_ptr 型別指標並不會影響所指堆記憶體空間的引用計數。

除此之外,weak_ptr模板類中沒有過載 * 和 -> 運算子,這也就意味著,weak_ptr 型別指標只能訪問所指的堆記憶體,而無法修改它。

1、weak_ptr指標的建立

建立乙個 weak_ptr 指標,有以下 3 種方式:

1) 可以建立乙個空 weak_ptr 指標,例如:

std::weak_ptrwp1;

2) 憑藉已有的 weak_ptr 指標,可以建立乙個新的 weak_ptr 指標,例如:

std::weak_ptrwp2 (wp1);

若 wp1 為空指標,則 wp2 也為空指標;反之,如果 wp1 指向某一 shared_ptr 指標擁有的堆記憶體,則 wp2 也指向該塊儲存空間(可以訪問,但無所有權)。

3) weak_ptr 指標更常用於指向某一 shared_ptr 指標擁有的堆記憶體,因為在構建 weak_ptr 指標物件時,可以利用已有的 shared_ptr 指標為其初始化。例如:

std::shared_ptrsp (new int);

std::weak_ptrwp3 (sp);

由此,wp3 指標和 sp 指標有相同的指標。再次強調,weak_ptr 型別指標不會導致堆記憶體空間的引用計數增加或減少。

2) weak_ptr模板類提供的成員方法

和 shared_ptr、unique_ptr相比,weak_ptr模板類提供的成員方法不多,表 1 羅列了常用的成員方法及各自的功能。

表 1 weak_ptr指標可呼叫的成員方法

成員方法

功 能operator=()

過載 = 賦值運算子,是的 weak_ptr 指標可以直接被 weak_ptr 或者 shared_ptr 型別指標賦值。

swap(x)

其中 x 表示乙個同型別的 weak_ptr 型別指標,該函式可以互換 2 個同型別 weak_ptr 指標的內容。

reset()

將當前 weak_ptr 指標置為空指標。

use_count()

檢視指向和當前 weak_ptr 指標相同的 shared_ptr 指標的數量。

expired()

判斷當前 weak_ptr 指標為否過期(指標為空,或者指向的堆記憶體已經被釋放)。

lock()

如果當前 weak_ptr 已經過期,則該函式會返回乙個空的 shared_ptr 指標;反之,該函式返回乙個和當前 weak_ptr 指向相同的 shared_ptr 指標。

再次強調,weak_ptr模板類沒有過載 * 和 -> 運算子,因此 weak_ptr 型別指標只能訪問某一 shared_ptr 指標指向的堆記憶體空間,無法對其進行修改。

下面的樣例演示了 weak_ptr 指標以及表 1 中部分成員方法的基本用法:

#include

#include

using namespace std;

int main()

程式執行結果為:21

10

有關表 1 中其它成員函式的用法,感興趣的讀者可直接檢視 weak_ptr 官網。

C 智慧型指標 weak ptr

weak ptr 是一種不控制物件生命週期的智慧型指標,它指向乙個 shared ptr 管理的物件.進行該物件的記憶體管理的是那個強引用的 shared ptr.weak ptr只是提供了對管理物件的乙個訪問手段.weak ptr 設計的目的是為配合 shared ptr 而引入的一種智慧型指標來...

C 11 智慧型指標 二 weak ptr

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

智慧型指標weak ptr

智慧型指標weak ptr主要用來協助shared ptr。不參與引用計數,但是有以下好處 1 打破遞迴的依賴關係 2 使用乙個共享的資源但是不要所有權,不新增引用計數 3 避免懸空指標。使用方法有二 方法一 boost shared ptrsp new std string method1 從sh...