C 中智慧型指標迴圈指向的陷阱

2021-04-29 19:26:49 字數 627 閱讀 3651

c++利用引用技術和智慧型指標可以實現對堆記憶體的自動管理,當智慧型指標退出生命週期時,會減小管理物件的引用計數,當物件引用計數為0時,便釋放該堆記憶體資源。看上去這一技術很不錯,堆記憶體有生命週期了,不用手動釋放了。實時上智慧型指標任然存在危險,下面就是乙個例子。

class a;

class b;

class a

;class b

;...

ptrinsa = new a;// insa->refcount = 1

ptrinsb = 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了,於是記憶體洩漏。

C 11智慧型指標Shared ptr陷阱

1.不要把乙個原生指標給多個shared ptr管理 int ptr new int shared ptr p1 ptr shared ptr p2 ptr logic error ptr物件被刪除了2次2.不要把this指標給shared ptr class test private shared...

智慧型指標(指向轉移寫法)

includeusing namespace std templateclass auto ptr 預設引數的建構函式 auto ptr auto ptr rhs pointee rhs.release auto ptr auto ptr operator auto ptr rhs return t...

C 中的智慧型指標

長久以來 c 最被人詬病的就是它的記憶體管理,寫個稍微複雜點的程式就經常會碰到記憶體洩漏問題。為了解決這個問題,c 也做了許多努力。在 c 98 標準中首先提出了智慧型指標的概念,引入了 auto ptr。但是在實踐中,auto ptr 有不少問題。因此在 c 11 標準中對原有的智慧型指標又做了進...