三種智能指針的使用與區別


  作為剛剛入坑的小白,在編寫程序的過程中常常不注意就會弄出很多的野指針。今天看了看總結了一下三種智能指針(auto_ptr、shared_ptr與unique_ptr)的用法與區別。第一次寫博,如有錯誤與不成熟的見解請一定指正。

  指針使用完畢后會使用delete回收內存,但剛剛入門的小白往往會忽略這一語句,但即使在代碼末尾添加了delete也不一定會起到作用,例如:

 1 void demo(string &str)
 2 {
 3     string *p = new string(str);
 4     ...
 5     if (XXX)
 6     {
 7         throw exceptions();
 8     }
 9     str = p;
10     delete p;
11 }

  當程序發生異常,不斷的調用demo函數時,同樣也會造成內存的泄漏。所以為了滿足函數無論是在正常終止還是異常終止都能夠釋放內存,智能指針提供了解決的方案。

  一、auto_ptr模板

  auto_ptr與shared_ptr、unique_ptr都定義了類似指針的對象,可以將new到的地址賦給這一對象,當智能指針過期時,析構函數會調用delete函數,對象將被銷毀,由此內存可以自動被釋放。

  二、shared_ptr模板

  先看代碼:

 

auto_ptr p1 (new string("hello world!");
auto_ptr p2;
p2 = p1; 

 

  在以上代碼中,p1與p2指向同一對象,常規指針在釋放內存時,系統會嘗試刪除同一對象兩次。在auto_ptr中,對象的所有權會歸於p2,p1將會變為野指針。shared_ptr則允許多個指針指向同一個對象,每多一個指針指向,計數器就會+1,同樣在釋放的時候,當數值減為0的時候即最后一個指針過期的時候才會調用delete函數。

  三、unique_ptr模板

  同樣為了避免多個指針指向,unique_ptr嚴格了所有權的概念,即我的就我的,不允許他人指向(如代碼段二中,采用unique_ptr編輯將會報錯,而原代碼會編譯通過但可能造成崩潰)。

  四、總結

  需要多個指針指向一個對象時可使用shared_ptr,如指針數組。不需要多個指針指向一個對象可使用uniq_ptr,uniqu_ptr比auto_ptr更加安全(編譯報錯遠比程序崩潰好得多)。這里做了一個表格總結。

                      

  

  

 


免責聲明!

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



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