和 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...