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