智慧型指標 weak ptr

2021-08-15 08:57:26 字數 1463 閱讀 3824

weak_ptr:

weak_ptr是為了配合shared_ptr而引入的一種智慧型指標,它更像是shared_ptr的乙個助手而不是智慧型指標,因為它不具有普通指標的行為,沒有過載operator*和->,它的最大作用在於協助shared_ptr工作,像旁觀者那樣觀測資源的使用情況.

用法:weak_ptr被設計為與shared_ptr共同工作,可以從乙個shared_ptr或者另乙個weak_ptr物件構造,獲得資源的觀測權。但weak_ptr沒有共享資源,它的構造不會引起指標引用計數的增加。

使用weak_ptr的成員函式use_count()可以觀測資源的引用計數,另乙個成員函式expired()的功能等價於use_count()==0,但更快,表示被觀測的資源(也就是shared_ptr的管理的資源)已經不復存在。

weak_ptr可以使用乙個非常重要的成員函式lock()從被觀測的shared_ptr獲得乙個可用的shared_ptr物件, 從而操作資源。但當expired()==true的時候,lock()函式將返回乙個儲存空指標的shared_ptr.

例項:#include

#include

using namespace boost;

using namespace std;

int _tmain(int argc, _tchar* argv)

assert(wp.use_count() == 1);

return 0;

}獲得this的shared_ptr

weak_ptr的乙個重要用途是獲得this指標的shared_ptr,使物件自己能夠生產shared_ptr管理自己;物件使用weak_ptr觀測this指標,這並不影響引用計數,在需要的時候就呼叫lock()函式,返回乙個符合要求的shared_ptr共外界使用.

這個解決方案被實現為乙個慣用法,在標頭檔案定義了乙個助手類enable_shared_from_this,它的宣告摘要如下:

template

class enable_shared_from_this

使用的時候只需要讓像被shared_ptr管理的類從它繼承即可,成員函式shared_from_this()會返回this的shared_ptr.例如:

#include

#include

using namespace boost;

using namespace std;

class self_shared: public enable_shared_from_this

int x;

void print()

注意:千萬不能從乙個普通物件(非shared_ptr)使用shared_from_this()獲去shared_ptr,例如

self_shared ss;

shared_ptrp = ss.shared_from_this();//錯誤!

在執行時會導致shared_ptr析構時企圖刪除乙個棧上分配的物件,發生未定義行為。

智慧型指標weak ptr

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

智慧型指標 weak ptr

weak ptr是為了配合shared ptr而引入的一種智慧型指標,它更像是shared ptr的乙個助手而不是智慧型指標,因為它不具有普通指標的行為,沒有過載operator 和 它的最大作用在於協助shared ptr工作,像旁觀者那樣觀測資源的使用情況.用法 weak ptr被設計為與sha...

智慧型指標之weak ptr

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