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