//本文內容,來自 《C++ Primer》中文版,第五版
一、shared_ptr類
1、初始化
shared_ptr<string> p1;
e.g
if(p1 && p1->empty()) *p1="hi";
shared_ptr<list<int>> p2;
2、支持的操作
- p //將p用作一個條件判斷,如果其指一個對象,則爲true
- *p //獲取其指向的對象
- p->mem //等價於 (*p).mem
- p.get() //返回p中保存的指針
- swap(p,q) //交換p,q
- p.swap(q)
- make_shared<T> (args) //返回一個shared_ptr,指向一個動態分配的類型爲T的對象。並且用args初始化該對象
e.g
share_ptr<int> p3 = make_shared<int> (42);
shared_ptr<string> p4 = make_shared<string>(10, '9');
shared_ptr<int> p5 = make_shared_ptr<int>(); //*p5值爲0
- make_shared<T> p(q) //p 是 shared_ptr q的拷貝;此操作會使q的計數器遞增;(q中的指針,必須能夠轉換爲T*)
- p = q //p和q必須都是shared_ptr,並且所保存的指針必須能相互轉換;p的引用計數會減1;q的引用計數會加1
- p.unique() //若p.use_count()爲1;則返回true;否則返回false;
- p.use_count() //返回與p共享對象的智能指針數量;可能很慢,主要用於調試
3、shared_ptr的賦值與拷貝
- auto p = make_shared<int> (42); //此時,p對象,只有p一個引用者
- auto q(p); //p和q指向相同對象;此時,該對象有兩個引用者
- auto r = make_shared<int>(42); //此時,r指向的int只有一個引用者
- r = q; //給r賦值,令他指向另一個地址
//q的引用計數遞增
//r的引用計數遞減;遞減後,r沒有引用者了,內存會自動釋放
4、注意事項
二、unique_ptr類
1、基本概念
它持有對對象的獨有權,即兩個 unique_ptr 不能指向一個對象,不能進行復制操作只能進行移動操作。
std::unique_ptr<char>p1(new char('a'));
std::unique_ptr<int>p2=p1; // 編譯時會報error
std::unique_ptr<int>p3=std::move(p1); // 轉移所有權, 現在那塊內存歸p3所有, p1成爲無效的針.
p3.reset(); //釋放內存.
p1.reset(); //由於p3已經釋放,所以p1的釋放沒意義
2、常用操作
//所有權從p1轉移給p2
unique_ptr<string> p2(p1.release());//release後p1爲空
unique_ptr<string>p3(new string("Trex"));
//將所有權從p3轉移到p2
p2.reset(p3.release());//reset釋放了p2原來指向的內存空間,指向p3的內存空間,在release後p3爲空
三、weak_ptr類
1、基本概念
weak_ptr是一種不控制所指向對象生存期的智能指針,它指向一個由shared_ptr管理的對象,將一個weak_ptr綁定到一個shared_ptr不會改變shared_ptr的引用計數。一旦最後一個指向對象的shared_ptr被銷燬,對象就會被釋放,即使有weak_ptr指向對象,對象還是會被釋放。
weak_ptr的操作
weak_ptr的作用:
weak_ptr是爲配合shared_ptr而引入的一種智能指針來協助shared_ptr工作,它可以從一個shared_ptr或另一個weak_ptr對象構造,它的構造和析構不會引起引用記數的增加或減少。沒有重載*和->但可以使用lock獲得一個可用的shared_ptr對象
引用計數有一個問題就是互相引用形成環,這樣兩個指針指向的內存都無法釋放。需要手動打破循環引用或使用weak_ptr。顧名思義,weak_ptr是一個弱引用,只引用,不計數。如果一塊內存被shared_ptr和weak_ptr同時引用,當所有shared_ptr析構了之後,不管還有沒有weak_ptr引用該內存,內存也會被釋放。所以weak_ptr不保證它指向的內存一定是有效的,在使用之前需要檢查weak_ptr是否爲空指針。
環的形成與解決過程可參考:https://blog.csdn.net/Tokyo_2024/article/details/80097272