智慧型指標weak ptr的核心原始碼實現

2022-09-23 16:09:09 字數 1403 閱讀 2276

weakptr的作為弱引用指標,其實現依賴於counter的計數器類和share_ptr的賦值,構造,所以需要把counter和share_ptr也簡單實現一下。

counter物件的目地就是用來申請乙個塊記憶體來存引用基數,簡單實現如下:

class counter

; int s;

int w;

};s是share_ptr的引用計數,w是weak_ptr的引用計數,當w為0是,刪除counter物件。

share_ptr的簡單實現如下:

template class weakptr;//為了用weak_ptr的lock(),來生成share_ptr用,需要拷貝構造用

template

class shareptr

friend class weakptr; //方便weak_ptr與share_ptr設定引用計數和賦值。

private:

void release()}}

t* _ptr;

counter* cnt;

};share_ptr的函式介面,構造,拷貝構造,賦值,解引用。通過release來在引用計數為0的時候刪除_ptr和cnt的記憶體。

那麼最後可以給出weak_ptr的實現,如下:

template

class weakptr

weakptr(shareptr& s):

_ptr(s._ptr),cnt(s.cnt)

~weakptr()

weakptr& operator =(weakptr & w)

return *this;

} weakptr& operator =(shareptr & s)

bool expired()

}} t* _ptr;

counter* cnt;

};share_ptr的一般介面是,通過share_ptr來構造,通過expired函式檢查原始指標是否為空,lock來轉化為share_ptr。

測試**如下:

class parent;

class child;

class parent

;class child

;int main()

{ //shareptr ft(new parent());

//shareptr son(new child());

//ft->ch=son;

//son->pt=ft;

//shareptr son2=(ft->ch).lock();

shareptr i;

weakptr wi(i);

cout《通過開啟注釋,可以模擬share_ptr的經典的迴圈引用的案例,也可以檢查指標是否為空。完整**,加入iostream標頭檔案和std的namespace就可以編譯執行了。

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