C++中智能指針循環指向的陷阱

C++利用引用技術和智能指針可以實現對堆內存的自動管理,當智能指針退出生命週期時,會減小管理對象的引用計數,當對象引用計數爲0時,便釋放該堆內存資源。看上去這一技術很不錯,堆內存有生命週期了,不用手動釋放了。實時上智能指針任然存在危險,下面就是一個例子。

class A;
class B;

class A
{
private:
int refCount;// 引用計數,reference count
...
public:
Ptr<B> pB;// 智能指針,smart pointer
};

class B
{
private:
int refCount;// 引用計數,reference count
...
public:
Ptr<A> pA;// 智能指針,smart pointer
};

...
Ptr<A> insA = new A;// insA->refCount = 1
Ptr<B> insB = new B;// insB->refCount = 1
insA->pB = insB;// insA->refCount = 2
insB->pA = insA;// insB->refCount = 2
...

上述代碼中的insA和insB指向的內存似乎在兩個智能指針退出生命週期後會自動釋放掉,實際上不然,假如insA先退出生命週期,insA->refCount減1,insA->refCount == 1;insA不會釋放,於是有insB->refCount == 2;然後insB退出生命週期,insB->refCount--,insB->refCount == 1;insB爲釋放,此時已經沒有時機釋放insA和insB了,於是內存泄漏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章