成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開(kāi)發(fā) 后端
今天我們要介紹boost中的智能指針的使用。對(duì)于內(nèi)存管理,C++中有兩個(gè)實(shí)現(xiàn)方案: 垃圾回收機(jī)制和智能指針。而智能指針被認(rèn)為是解決C++內(nèi)存問(wèn)題的最優(yōu)方案。

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

內(nèi)存管理是一個(gè)比較繁瑣的問(wèn)題,C++中有兩個(gè)實(shí)現(xiàn)方案: 垃圾回收機(jī)制和智能指針。垃圾回收機(jī)制因?yàn)樾阅艿仍虿槐籆++的大佬們推崇, 而智能指針被認(rèn)為是解決C++內(nèi)存問(wèn)題的最優(yōu)方案。

1. 定義

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

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

2. Boost::scoped_ptr<T>

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

下面是scoped_ptr的幾個(gè)特點(diǎn):

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

scoped_ptr不能用在標(biāo)準(zhǔn)庫(kù)的容器上。(用shared_ptr代替)

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

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

3.Boost::shared_ptr<T>

shared_ptr 具有如下幾個(gè)特點(diǎn):

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

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

3.可以被標(biāo)準(zhǔn)庫(kù)的容器所使用

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

我們可以看下如下例子:

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

4. Boost::intrusive_ptr<T>

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

5. Boost::weak_ptr<T>

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

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

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

6. Boost::shared_array<T> 和Boost::scoped_array<T>

前面提到過(guò)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<test> a(new test[]);  
  5.     for (int i = 0; i < size; ++i)  
  6.         a[i].print();  
  7.    return 0;   

7. 使用智能指針的幾個(gè)注意點(diǎn)

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

1.聲明一個(gè)智能指針的時(shí)候要立即給它實(shí)例化, 而且一定不能手動(dòng)釋放它。…_ptr<T> 不是T* 類型。所以:

                a: 聲明的時(shí)候要…_ptr<T> 而不是….._ptr<T*>

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

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

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

8. 總結(jié)

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

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

 

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2010-02-05 14:36:20

C++智能指針

2023-12-20 12:40:51

C++RAII編程

2023-11-17 11:48:08

智能指針C++

2021-09-09 17:05:36

C++智能指針語(yǔ)言

2024-12-26 10:45:08

2024-01-24 11:44:44

C++智能指針開(kāi)發(fā)

2021-12-21 15:31:10

C++語(yǔ)言指針

2021-07-29 06:09:05

萬(wàn)能指針C語(yǔ)言void

2011-04-11 11:09:50

this指針

2011-07-15 01:38:56

C++this指針

2015-07-27 11:34:03

Linux內(nèi)核指針

2021-08-11 09:01:48

智能指針Box

2024-03-01 16:43:48

C++11智能指針內(nèi)存

2011-04-19 16:38:00

對(duì)象指針指針C++

2011-04-19 09:19:09

C++指針

2024-01-18 10:27:30

C++引用函數(shù)

2024-01-09 09:23:12

指針C++

2010-01-27 14:18:41

Android智能指針

2011-04-11 14:18:37

CC++指針

2023-11-09 23:56:21

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 电影91久久久 | 亚洲午夜精品久久久久久app | 一级毛片在线播放 | 999久久久| 国产日产久久高清欧美一区 | 毛片一级电影 | 中文字幕不卡 | 欧美在线色 | 中文字幕国产精品 | 欧美日韩福利 | 亚洲欧美日韩国产综合 | 韩国电影久久 | 国产日韩欧美在线 | 成人在线精品视频 | 怡红院成人在线视频 | 亚洲精品免费观看 | 黄色一级毛片 | 成人影院在线 | 黄色片免费 | 久久这里只有精品首页 | 色一阁| 国产一二区在线 | 午夜在线 | 黄色一级电影免费观看 | 一级毛片色一级 | 在线观看国产视频 | 黄色国产 | 久久九精品 | 国产在线一区二区三区 | 国产高清一区二区三区 | 日韩在线免费视频 | 综合激情av | 久久一区视频 | 日韩一区二区免费视频 | 精品久久久久久久久久久 | 久久99视频这里只有精品 | 精品粉嫩aⅴ一区二区三区四区 | 国产区在线看 | 欧美精品在线观看 | 欧美一级大片免费观看 | 8x国产精品视频一区二区 |