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

詳解C++中的Boost智能指針

編輯:C++入門知識

內存管理是一個比較繁瑣的問題,C++中有兩個實現方案: 垃圾回收機制和智能指針。垃圾回收機制因為性能等原因不被C++的大佬們推崇, 而智能指針被認為是解決C++內存問題的最優方案。   1. 定義   一個智能指針就是一個C++的對象, 這對象的行為像一個指針,但是它卻可以在其不需要的時候自動刪除。注意這個“其不需要的時候”, 這可不是一個精確的定義。這個不需要的時候可以指好多方面:局部變量退出函數作用域、類的對象被析構……。所以boost定義了多個不同的智能指針來管理不同的場景。   shared_ptr<T> 內部維護一個引用計數器來判斷此指針是不是需要被釋放。是boost中最常用的智能指針了。  scoped_ptr<t> 當這個指針的作用域消失之後自動釋放  intrusive_ptr<T> 也維護一個引用計數器,比shared_ptr有更好的性能。但是要求T自己提供這個計數器。  weak_ptr<T> 弱指針,要和shared_ptr 結合使用  shared_array<T> 和shared_ptr相似,但是訪問的是數組  scoped_array<T> 和scoped_ptr相似,但是訪問的是數組      2. Boost::scoped_ptr<T>   scoped_ptr 是boost中最簡單的智能指針。scoped_ptr的目的也是很簡單, 當一個指針離開其作用域時候,釋放相關資源。特別注意的一定就是scoped_ptr 不能共享指針的所有權也不能轉移所有權。也就是說這個內存地址就只能給的聲明的變量用,不能給其他使用。   下面是scoped_ptr的幾個特點:   scoped_ptr的效率和空間的消耗內置的指針差不多。   scoped_ptr不能用在標准庫的容器上。(用shared_ptr代替)   scoped_ptr 不能指向一塊能夠動態增長的內存區域(用scoped_array代替)   class test   {   public:       void print()     {        cout << "test print now" <<endl;     }     };    int _tmain(int argc, _TCHAR* argv[])   {   boost::scoped_ptr<test> x(new test);    x->print();      return 0;   } 3.Boost::shared_ptr<T>   shared_ptr 具有如下幾個特點:   1.在內部維護一個引用計數器, 當有一個指針指向這塊內存區域是引用計數+1, 反之-1, 如果沒有任何指針指向這塊區域, 引用計數器為0,釋放內存區域。   2.可以共享和轉移所有權。   3.可以被標准庫的容器所使用   4.不能指向一塊動態增長的內存(用share_array代替)   我們可以看下如下例子:   int _tmain(int argc, _TCHAR* argv[])   {   boost::shared_ptr<test> ptr_1(new test);     ptr_1->print();//引用計數為1     boost::shared_ptr<test> ptr_2 = ptr_1;     ptr_2->print();//引用計數為2    ptr_1->print();// 引用計數還是為2    return 0;   } 4. Boost::intrusive_ptr<T>   intrusive_ptr 的主要和share_ptr一樣, 對比share_ptr,其效率更高,但是需要自己維護一個引用計數器, 這裡不做詳細介紹。   5. Boost::weak_ptr<T>   weak_ptr 就是一個弱指針。weak_ptr 被shared_ptr控制, 它可以通過share_ptr的構造函數或者lock成員函數轉化為share_ptr。   weak_ptr的一個最大特點就是它共享一個share_ptr的內存,但是無論是構造還是析構一個weak_ptr 都不會影響引用計數器。   int _tmain(int argc, _TCHAR* argv[])     {        boost::shared_ptr<test> sharePtr(new test);;      boost::weak_ptr<test> weakPtr(sharePtr);        //weakPtr 就是用來保存指向這塊內存區域的指針的       //干了一大堆其他事情     boost::shared_ptr<test> sharePtr_2 = weakPtr.lock();     if (sharePtr_2)          sharePtr_2->print();      return 0;    } 6. Boost::shared_array<T> 和Boost::scoped_array<T>   前面提到過shared_ptr和scoped_ptr不能用於數組的內存(new []),所以shared_array和scoped_array就是他們的代替品。我們可以看下shared_array的用法   int _tmain(int argc, _TCHAR* argv[])   {       const int size = 10;       boost::shared_array<test> a(new test[]);      for (int i = 0; i < size; ++i)          a.print();     return 0;   } 7. 使用智能指針的幾個注意點   下面是幾個使用智能指針需要注意的地方:   1.聲明一個智能指針的時候要立即給它實例化, 而且一定不能手動釋放它。…_ptr<T> 不是T* 類型。所以:   a: 聲明的時候要…_ptr<T> 而不是….._ptr<T*>   b:不能把T* 型的指針賦值給它   c: 不能寫ptr=NULl, 而用ptr.reset()代替。     不能循環引用。  不要聲明臨時的share_ptr, 然後把這個指針傳遞給一個函數 

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