智慧型指標的交叉引用

2021-08-05 22:35:27 字數 1130 閱讀 2870

關於智慧型指標的交叉引用以及解決方法~~

智慧型指標的交叉引用會導致什麼問題呢??首先,先來看以下一段**……

class b;

class a

;class b

;int main()

顯而易見,類a中有乙個指向類b的shared_ ptr強型別智慧型指標,類b中有乙個指向類a的shared_ ptr強型別智慧型指標此時,有兩個強智慧型指標指向了物件a,物件a的引用計數為2。也有兩個強智慧型指標指向了物件b,物件b的引用計數為2。物件a與物件b的關係如圖所示

當主函式return返回後,物件a的引用計數減一變為1,物件b的引用計數減一變為1,此時因為引用計數不為0,所以不能析構物件釋放記憶體,程式結束造成記憶體洩漏

解決方法:將類a和類b中的shared_ptr強智慧型指標都換成weak_ptr弱智能指標

class b;

class a

;class b

;int main()

weak_ptr弱智能指標,雖然有引用計數,但實際上它並不增加計數,而是只觀察物件的引用計數,weak_ptr的引用計數指的是有多少個weak_ptr在觀察同乙個shared_ptr。而shared_ptr強智慧型指標的引用計數是對資源的引用計數所以此時物件a的引用計數只為1,物件b的引用計數也只為1。此時物件a與物件b的關係如圖所示

當主函式return返回後,物件a的引用計數減一變為0,所以正常析構物件a;物件b的引用計數減一變為0,所以正常析構物件b,此時不會造成記憶體洩漏

總結:建立物件的時候用shared_ptr強智慧型指標,別的地方一律持有weak_ptr弱智能指標。

哈哈,是不是又發現你的程式中有乙個bug,卻不知道**的問題,那就趕緊檢查檢查是不是智慧型指標惹的禍→_→*

智慧型指標的死穴 迴圈引用

c 最新標準c 11中已將基於引用計數的智慧型指標share prt收入囊中,智慧型指標的使用門檻越來越低,不需要使用boost庫,我們也能輕鬆享受智慧型指標給我們帶來的方便。智慧型指標,正如它的名字一樣,似乎是個近乎完美的聰明角色,程式設計師不用再糾結於new出來的內存在哪釋放比較合適這種問題。比...

引用計數與智慧型指標

c 沒有完善的gc機制,直到c 11才在stl中正式引入了智慧型指標。出現在庫中說明智慧型指標不是語言特性。c 智慧型指標實現了部分自動記憶體管理的目的。引用計數是使用資源管理函式 構造析構複製等函式 和作用域原理實現的。每塊動態分配的記憶體 堆記憶體 都維護乙個相應的計數器,來記錄指向該記憶體的變...

基於引用計數的智慧型指標

pragma once include includeusing namespace std templateclass smartpointer smartpointer smartpointer src 拷貝建構函式 t operator 操作符過載,注意返回型別 t operator 操作符過...