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

2021-06-29 15:45:02 字數 1231 閱讀 4878

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

然後如此完美的東西,也有其不容忽視的地方,直接上**:

// share_ptr.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "common_class.h"

class b;

class a;

virtual ~a(){};

public:

void setb(const item_type ptr_b)

private:

item_type m_b;

};class b;

virtual ~b(){};

public:

void seta(const item_type ptr_a)

private:

item_type m_a;

};int _tmain(int argc, _tchar* argv)

getchar();//檢視記憶體狀態

//b先出作用域,b的引用計數減少為1,不為0,所以堆上的b空間沒有被釋放,

//且b持有的a也沒有機會被析構,a的引用計數也完全沒減少

//a後出作用域,同理a的引用計數減少為1,不為0,所以堆上a的空間也沒有被釋放

return 0;

}

兩次檢視記憶體資源狀態結果

結果可知:記憶體增加了幾乎20m,更何況我定義的兩個物件本身不怎麼佔資源,如果內部維護了幾個list,結果可想而知!

a和b都互相指著對方吼,「放開我的引用!「,「你先發我的我就放你的!」,於是悲劇發生了。

所以在使用基於引用計數的智慧型指標時,要特別小心迴圈引用帶來的記憶體洩漏,迴圈引用不只是兩方的情況,只要引用鏈成環都會出現問題。當然迴圈引用本身就說明設計上可能存在一些問題,如果特殊原因不得不使用迴圈引用,那可以讓引用鏈上的一方持用普通指標(或弱智能指標weak_ptr)即可.

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

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

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

class node node private int value int main 上面的程式不會有問題,呼叫三次建構函式,三次析構函式。下面增加乙個指向父節點的指標。class node node private int value int main 呼叫了三次建構函式,但是沒用呼叫析構函式,這...

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

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