日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解C++中的Boost智能指針

這篇文章主要介紹 boost中的智能指針的使用。

發(fā)展壯大離不開廣大客戶長期以來的信賴與支持,我們將始終秉承“誠信為本、服務(wù)至上”的服務(wù)理念,堅持“二合一”的優(yōu)良服務(wù)模式,真誠服務(wù)每家企業(yè),認真做好每個細節(jié),不斷完善自我,成就企業(yè),實現(xiàn)共贏。行業(yè)涉及成都濕噴機等,在網(wǎng)站建設(shè)、成都全網(wǎng)營銷推廣、WAP手機網(wǎng)站、VI設(shè)計、軟件開發(fā)等項目上具有豐富的設(shè)計經(jīng)驗。

內(nèi)存管理是一個比較繁瑣的問題,C++中有兩個實現(xiàn)方案: 垃圾回收機制和智能指針。垃圾回收機制因為性能等原因不被C++的大佬們推崇, 而智能指針被認為是解決C++內(nèi)存問題的最優(yōu)方案。

1. 定義

一個智能指針就是一個C++的對象, 這對象的行為像一個指針,但是它卻可以在其不需要的時候自動刪除。注意這個“其不需要的時候”, 這可不是一個精確的定義。這個不需要的時候可以指好多方面:局部變量退出函數(shù)作用域、類的對象被析構(gòu)……。所以boost定義了多個不同的智能指針來管理不同的場景。

shared_ptr 內(nèi)部維護一個引用計數(shù)器來判斷此指針是不是需要被釋放。是boost中最常用的智能指針了。
scoped_ptr 當這個指針的作用域消失之后自動釋放
intrusive_ptr 也維護一個引用計數(shù)器,比shared_ptr有更好的性能。但是要求T自己提供這個計數(shù)器。
weak_ptr 弱指針,要和shared_ptr 結(jié)合使用
shared_array 和shared_ptr相似,但是訪問的是數(shù)組
scoped_array 和scoped_ptr相似,但是訪問的是數(shù)組

2. Boost::scoped_ptr

scoped_ptr 是boost中最簡單的智能指針。scoped_ptr的目的也是很簡單, 當一個指針離開其作用域時候,釋放相關(guān)資源。特別注意的一定就是scoped_ptr 不能共享指針的所有權(quán)也不能轉(zhuǎn)移所有權(quán)。也就是說這個內(nèi)存地址就只能給的聲明的變量用,不能給其他使用。

下面是scoped_ptr的幾個特點:

scoped_ptr的效率和空間的消耗內(nèi)置的指針差不多。

scoped_ptr不能用在標準庫的容器上。(用shared_ptr代替)

scoped_ptr 不能指向一塊能夠動態(tài)增長的內(nèi)存區(qū)域(用scoped_array代替)

 
 
 
  1. class test   
  2. {   
  3. public:   
  4.     void print()   
  5.   {   
  6.      cout << "test print now" <
  7.  }    
  8.  };   
  9.  int _tmain(int argc, _TCHAR* argv[])   
  10. {   
  11. boost::scoped_ptr x(new test);   
  12.  x->print();   
  13.    return 0;   

3.Boost::shared_ptr

shared_ptr 具有如下幾個特點:

1.在內(nèi)部維護一個引用計數(shù)器, 當有一個指針指向這塊內(nèi)存區(qū)域是引用計數(shù)+1, 反之-1, 如果沒有任何指針指向這塊區(qū)域, 引用計數(shù)器為0,釋放內(nèi)存區(qū)域。

2.可以共享和轉(zhuǎn)移所有權(quán)。

3.可以被標準庫的容器所使用

4.不能指向一塊動態(tài)增長的內(nèi)存(用share_array代替)

我們可以看下如下例子:

 
 
 
  1. int _tmain(int argc, _TCHAR* argv[])   
  2. {   
  3. boost::shared_ptr ptr_1(new test);   
  4.   ptr_1->print();//引用計數(shù)為1  
  5.    boost::shared_ptr ptr_2 = ptr_1;   
  6.   ptr_2->print();//引用計數(shù)為2  
  7.   ptr_1->print();// 引用計數(shù)還是為2  
  8.   return 0;   

4. Boost::intrusive_ptr

intrusive_ptr 的主要和share_ptr一樣, 對比share_ptr,其效率更高,但是需要自己維護一個引用計數(shù)器, 這里不做詳細介紹。

5. Boost::weak_ptr

weak_ptr 就是一個弱指針。weak_ptr 被shared_ptr控制, 它可以通過share_ptr的構(gòu)造函數(shù)或者lock成員函數(shù)轉(zhuǎn)化為share_ptr。

weak_ptr的一個最大特點就是它共享一個share_ptr的內(nèi)存,但是無論是構(gòu)造還是析構(gòu)一個weak_ptr 都不會影響引用計數(shù)器。

 
 
 
  1. int _tmain(int argc, _TCHAR* argv[])    
  2.  {    
  3.     boost::shared_ptr sharePtr(new test);;  
  4.     boost::weak_ptr weakPtr(sharePtr);    
  5.     //weakPtr 就是用來保存指向這塊內(nèi)存區(qū)域的指針的   
  6.     //干了一大堆其他事情   
  7.   boost::shared_ptr sharePtr_2 = weakPtr.lock();    
  8.  if (sharePtr_2)   
  9.        sharePtr_2->print();  
  10.     return 0;   
  11.  } 

6. Boost::shared_array 和Boost::scoped_array

前面提到過shared_ptr和scoped_ptr不能用于數(shù)組的內(nèi)存(new []),所以shared_array和scoped_array就是他們的代替品。我們可以看下shared_array的用法

 
 
 
  1. int _tmain(int argc, _TCHAR* argv[])   
  2. {   
  3.     const int size = 10;   
  4.     boost::shared_array a(new test[]);  
  5.     for (int i = 0; i < size; ++i)  
  6.         a[i].print();  
  7.    return 0;   

7. 使用智能指針的幾個注意點

下面是幾個使用智能指針需要注意的地方:

1.聲明一個智能指針的時候要立即給它實例化, 而且一定不能手動釋放它?!璤ptr 不是T* 類型。所以:

                a: 聲明的時候要…_ptr 而不是….._ptr

                b:不能把T* 型的指針賦值給它

                c: 不能寫ptr=NULl, 而用ptr.reset()代替。

  1.   不能循環(huán)引用。
  2. 不要聲明臨時的share_ptr, 然后把這個指針傳遞給一個函數(shù)

8. 總結(jié)

智能指針使用上還是比較簡單的, 而且能比較有效得解決C++內(nèi)存泄露的問題,各位使用C++的童鞋趕快用起來吧。

原文鏈接:http://www.cnblogs.com/sld666666/archive/2010/12/16/1908265.html


網(wǎng)站題目:詳解C++中的Boost智能指針
網(wǎng)址分享:http://m.5511xx.com/article/cdheped.html