C++智能指針類

//本文內容,來自 《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

2、常用操作

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