智慧型指標的迴圈引用與解決

2022-03-11 18:38:06 字數 935 閱讀 3675

class node

~node()

private:

int value;

};int main()

上面的程式不會有問題,呼叫三次建構函式,三次析構函式。

下面增加乙個指向父節點的指標。

class node

~node()

private:

int value;

};int main()

呼叫了三次建構函式,但是沒用呼叫析構函式,這就導致了記憶體洩漏。

shared_ptr的迴圈引用定義:

當兩個物件(主體是物件)使用shared_ptr相互引用時,那麼當超出範圍時,都不會刪除記憶體。發生這種情況的原因是shared_ptr在其析構函式中遞減關聯記憶體的引用計數後,檢查count是否為0,如果不為0,析構函式就不會釋放相應的記憶體。當出現了迴圈引用後,就會發現count的值總是不為0。

這裡我用goodnotes畫了兩張圖,希望能把這個過程解釋清楚:

那麼如何解決這個問題?

使用weak_ptr

下面使用weak_ptr改進二叉樹。weak_ptr不會導致強引用計數增加。

class node

~node()

private:

int value;

};int main()

C 程式設計智慧型指標迴圈引用解決

字型大小 小 大 2012 10 23 15 55 c 中智慧型指標的引入,使得開發人員在與記憶體的鬥爭中佔據上峰。然而凡事都不會盡善盡美,智慧型指標的迴圈引用缺陷還是會引發令人談虎色變的記憶體洩露。本文的內容就是講述,如何解決迴圈引用帶來的記憶體問題。背景 智慧型指標採用boost庫,語言c 開發...

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

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

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

智慧型指標的實現思路也體現了c 基於物件的原則,物件應該為自己管理的資源負責,包括資源的分配與釋放,而且最好將資源的釋放與分配搞的自動化一點,典型的實現方法就是在建構函式裡分配資源,在析構函式裡釋放資源,這樣當其他程式設計師在使用這個物件時,該物件的資源問題幾乎不用額外的操心,即優雅又方便 然後如此...