程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 智能指針 shared_ptr

C++ 智能指針 shared_ptr

編輯:C++入門知識

 今天晚上去旁聽了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++本身並沒有這樣的功能,其繁雜且易出錯的內存管理也一直為廣大程序員所诟病。<<引用>>    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved