C++ 智能指針 shared_ptr


  今天晚上去旁聽了C++高級編程的課,其中提到智能指針。第一反映還以為是auto_ptr呢,一聽才知道是share_ptr這個。哦,原來是C++11特性。大致的原因是auto_ptr有一點缺陷,而share_ptr比較安全。好吧,那就這個了。
  先寫一個簡單的代碼感受一下

 1 #include <iostream>
 2 #include <tr1/memory>
 3 
 4 using namespace std;
 5 using std::tr1::shared_ptr;
 6 
 7 int main()
 8 {
 9     {
10         shared_ptr<double> pp(new double(22.22));
11         {
12             shared_ptr<double> pp_copy = pp;
13             *pp_copy=11.11;
14         }//在這個作用域中pp_copy會自動銷毀,但是分配給pp的double不會別銷毀。
15         cout<<"pp="<<*pp<<endl;
16     }//此時pp會自動銷毀,動態分配的double會被銷毀,因為已經沒有指針指向它。
17     return 0;
18 }

  其實只是看上面的代碼,覺得好像沒有實際的作用。

 1 int main()
 2 {
 3     double * pp = new double(22.22);
 4     {
 5         double * pp_copy = pp;
 6         *pp_copy=11.11;
 7         delete pp_copy;
 8     }
 9     cout<<"pp="<<*pp<<endl;//輸出的數值是臟數據 pp成了懸垂指針
10     return 0;
11 }

  到這里你可能會說那個delete不用不就行了?其實是的。只要小心使用delete就行。可是有沒有想過,但代碼量很大的時候,就不知道是不是要delete了,這就會造成內存泄漏了。

1     double * pp = new double(22.22);
2     double * pp_copy = new double(22.22);
3     //delete pp_copy;
4     pp_copy = pp;
5     *pp_copy=11.11;

  就像這樣如果沒有delete就會內存泄漏。如果是使用智能指針,那么執行上面第4行語句時,會釋放第二行分配的內存。

  總結: 智能指針是為了實現類似於Java中的垃圾回收機制(gc)。Java的垃圾回收機制使程序員從繁雜的內存管理任務中徹底的解脫出來,在申請使用一塊內存區域之后,無需去關注應該何時何地釋放內存,Java將會自動幫助回收。但是出於效率和其他原因(可能C++設計者不屑於這種傻瓜氏的編程方式),C++本身並沒有這樣的功能,其繁雜且易出錯的內存管理也一直為廣大程序員所詬病。<<引用>>

 

運行環境: Win7 + codeblock 12.11

資料:
auto_ptr與share_ptr的區別:http://www.cppblog.com/expter/archive/2009/03/29/78270.html
懸垂指針與野指針:
http://www.cnblogs.com/submarine/archive/2013/03/02/2940169.html
引用:
http://blog.163.com/bbluesnow@126/blog/static/27784545201222682418694/

 


免責聲明!

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



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