c++智能指針詳解


動態內存

  每個程序有一個內存池,稱為堆,用於存儲動態分配的對象,即那些在程序運行時分配的對象。動態對象的生存周期由程序來控制,也就是說,當動態對象不再使用時,我們的代碼必須顯示的銷毀他們。

  使用懂態內存是十分必要的額,但眾所周知,正確管理動態內存是十分棘手的。比如忘記釋放內存就會產生內存泄漏。有時尚有指針引用指向內存但被釋放了,就會產生野指針。因此產生了智能指針。c++11提供了三種包括:shared_ptr,unique_ptr,weak_ptr.

shared_ptr詳解

  所用到的技術就是引用技術,引用計數關聯到具體的object。當指向這個object的shared_ptr增加時,引用計數自加,減少時,引用計數減少。當引用技術為0時釋放改object。引用計數自增發生在初始化,賦值時。自減發生在賦值,析構時。

   shared_ptr<T> sp;             空智能指針。

   constexpr shared_ptr(nullptr_t) : shared_ptr() {}

 

   template <class U> explicit shared_ptr (U* p)   不支持隱式轉換。
   template <class U> shared_ptr (const shared_ptr<U>& x) noexcept; 
   template <class U> shared_ptr (shared_ptr<U>&& x) noexcept;
   template <class U> shared_ptr& operator= (const shared_ptr<U>& x) noexcept;
   template <class U> shared_ptr& operator= (shared_ptr<U>&& x) noexcept;

 

   p                        用p作為一個條件判斷,若p指向一個對象則為true。

   *p                       解引用p,獲得它指向的對象

   p->men                    等價於(*p).men

   p.get()                   返回p中保存的指針

   swap(p,q)                  交換p,q中的指針

   p.swap(q)              

   make_shared<T>(args)          返回一個shared_ptr,指向一個動態分配的類型為T的對象,用args初始化。

   shared_ptr<T>p(q)

   p=q                     

  p.unique()                 若p.use_count()為1,返回true,否則返回false。

   p.use_count()               返回p共享對象的智能指針數量,用於調試。

 

   當第一個智能指針被創建,唯一來源通過shared_ptr<T> p(new T); 或 shared_ptr<T> p=make_shared<T>();。另外一種情況T* p=new T;shared_ptr<T> q(p);這種會產生野指針,故不應這么寫。第一個智能指針,通過拷貝構造,拷貝賦值(或被其他智能指針賦值的此類智能指針)所衍生出來的智能指針共享一個引用計數。成員函數get不應通過獲得的指針進行釋放,初始化一個智能指針。

 unique_ptr

  某個時刻只能有一個unique_ptr指向一個給定對象。當unique_ptr被銷毀時,它所指向的對象也被銷毀了。

    

  與shanred_ptr不同,沒有類似make_shared的表標准庫返回一個unique_ptr.當我們定義一個unique_ptr時,需要其綁定一個new返回的指針上。此種初始化方式為顯示的。

  

  

  由於一個unique_ptr擁有它指向的對象,因此unique_ptr不支持普通的拷貝或復制操作。

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM