青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Boost.Smart庫學習筆記

Posted on 2009-07-23 10:53 天邊藍 閱讀(834) 評論(0)  編輯 收藏 引用
 

smart_ptr庫是Boost中比較小的庫之一,也是實際應用中使用最頻繁的庫之一。下面結合這段時間對它的學習了解,梳理Boost/smart_ptr庫的知識構架。

Boost/smart_ptr庫主要目的是為了解決C++中最讓人頭疼的部分:內存泄漏。自從C++引入異常機制以來,內存泄漏一直圍繞著C++程序員,每個C++都小心翼翼地防止著,但內存泄漏就像空氣中的NIHI病毒一樣,讓人防不勝防。如是,各種各樣的智能指針開始出現了,最終也就誕生了偉大的Boost/smart庫。

經過千萬次的錘煉,Boost/smart庫已經逐漸完美了,已被C++ 0x接受。估計再向前發展的空間比較小。

Boost/smart庫主要構建了以下幾種智能指針:

    1.scoped_ptr

    2.scoped_array

    3.shared_ptr

    4.shared_array

    5.weap_ptr

6.intrusive_ptr

    下面分別詳細介紹每種smart_ptr的用途。

1.    scoped_ptr

scoped_ptr是根據C++標準庫中的auto_ptr改進過來的。Auto_ptr的一個很大的缺陷就是在賦值的時候會轉移操作權限,而scoped_ptr不會發生這樣的情況,原因在于scoped_prt根本就不允許賦值操作:

    private

scoped_ptr(scoped_ptr const &);

    scoped_ptr & operator=(scoped_ptr const &);

使用scope_ptr需要注意的地方:

a.    scope_ptr只能從new操作符、0以及auto_ptr構造。

b.    operator*操作時做好先判斷ptr是否為0.如果ptr=0*操作會導致未定義的行為

使用方法和auto_ptr一樣,只是不允許賦值操作。示例:

 1#include<iostream>
 2#include<string>
 3#include<boost/scoped_ptr.hpp>
 4
 5class A{
 6    int i;
 7    public:
 8    A(int i=0){
 9        this->i=i;
10        std::cout<<"A() Called\n";
11    }

12    ~A(){
13        std::cout<<"~A() Called\n";
14    }

15    void f(){
16        std::cout<<"A::f() Called\n";
17        std::cout<<"A::i="<<i<<std::endl;;
18    }

19}
;
20
21int main(){
22    std::auto_ptr<A> p_auto(new A(6));
23    boost::scoped_ptr<A> p_scope(new A());
24    p_auto->f();
25    p_scope->f();
26    std::auto_ptr<A> p_auto2=p_auto;
27    //boost::scoped_ptr<A> p_scope2=p_scope;//編譯錯誤
28    p_auto->f();//p_auto已經轉移操作權限了,返回的是個裸指針
29    p_auto2->f();
30
31    return 0;
32}

2.    scoped_array

scoped_arrayscoped_ptr的數組形式的版本。scoped_array之所以是一個單獨的類而不是scoded_ptr的一個特化,這是因為元編程技術無法區分指向單個對象的指針和指向數組的指針,不管如何努力,還是沒有人能夠發現一種可靠的能區分這兩種形式指針的方法,這是因為數組太容易退化成指針了而且沒有任何信息表明它指向數組。最后只能我們用scoped_array單獨處理指向數組的指針了,正如delete無法取代delete[]一樣。

使用示例:

 1#include <algorithm>
 2#include <iostream>
 3#include <functional>
 4#include<boost/scoped_array.hpp>
 5
 6class A{
 7    int i;
 8    public:
 9    A(int i=0){
10        this->i=i;
11        std::cout<<"A() Called\n";
12    }

13    ~A(){
14        std::cout<<"~A() Called\n";
15    }

16    void f(){
17        std::cout<<"A::f() Called\n";
18        std::cout<<"A::i="<<i<<std::endl;;
19    }

20    void seti(int i){
21       this->i=i;
22    }

23}
;
24
25int main(){
26    boost::scoped_array<A> p_scope_array(new A[10]);
27    for(int i=0;i<10;i++){
28        p_scope_array[i].seti(i);
29        p_scope_array[i].f();
30    }

31
32    return 0;
33}

3.    shared_ptr

就我個人看來,shared_ptr是最有使用價值的智能指針了,它采用了非侵入式的引用技術技術,幾乎可以取代平時工作中可能導致內存泄漏的普通指針。另外它還提供了可自定義的析構方法,這么一來,它幾乎可以安全管理所有資源了(包含文件,句柄等等)。值得欣慰的是,shared_ptrshared_array已經被C++標準委員會接受,C++ 0x中應該就會包含這個讓大家使用很方便的智能指針了。

shared_ptr解決了共享對象什么時候刪除的問題。讓C++程序員不用再想盡方法刪除共享對象了。

使用shared_ptr需要注意的地方:

a.            shared_ptr可以從裸指針、另一個shared_ptrstd::auto_ptr或者weak_ptr構造而來

b.            shared_ptr的引用計數器來自堆分配。所以通過裸指針或者std::auto_ptr構造時。可能會因為堆空間不足而拋出std::bad_alloc的異常(非常小的幾率)

c.            從只能指針weak_ptr構造shared_ptr使weak_ptr的使用具有了線程安全。這里需要注意的是,如果weak_ptr懸空的話,那么shared_ptr將拋出一個bad_weak_ptr的異常。

d.            shared_ptr構造的時候,允許傳遞釋放所存儲對象的方法,這就讓我們可以用shared_ptr管理除了指針外的其他設備,示例:

 1#include <iostream>
 2#include<boost/shared_ptr.hpp>
 3
 4
 5class FileCloser{
 6    public:
 7    void operator()(FILE *file){
 8        std::cout<<"Called void operator()(FILE *file)"<<std::endl;
 9        if(file!=0)
10            fclose(file);
11    }

12}
;
13
14int main(){
15    {
16        FILE *f=fopen("test.txt","r");
17        if(f==0){
18           std::cout<<"Unable to open file"<<std::endl;
19        }

20        boost::shared_ptr<FILE> p_shared_file(f,FileCloser());
21        //通過p_shared_file操作文件
22    }

23    std::cout<<"File has been closed"<<std::endl;
24
25    return 0;
26}

27

e.            shared_ptr可以用在C++標準容器中

f.            最后附上shared_ptr的設計源碼,方面查閱

4.    shared_array

shared_arrayshared_ptr的數組形式,他們的關系就像scoped_ptrscoped_array的關系。shared_array的接口了shared_ptr的接口非常相似,但shared_array重載了下標運算符{},且不支持自定義的析構方式。

5.    weap_ptr

智能指針weap_ptrshared_ptr的觀察者,它不會影響shared_ptr所共享資源的所有權。為什么需要weap_ptr?因為在許多情況下,需要觀察某個共享資源但是又不想接受它的所有權,例如為了打破循環依賴關系、為了觀察某個共享資源而不想接受它的所有權或者為了避免懸空指針時,就需要使用weap_ptr

暫時有點難懂,留下它的設計文檔以后需要的時候再研究。

6.    intrusive_ptr

intrusive_ptrshared_ptr的侵入式版本了,因為使用頻率很低,暫時不做說明。

    總結:Boost.Smart庫是一個非常非常優秀的庫,是一個無論怎么評價都不為過的優秀庫,值得學習,值得廣泛應用。


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


Copyright © 天邊藍

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情av在线| 亚洲国产99精品国自产| 亚洲激情视频| 亚洲激情在线观看视频免费| 欧美人成免费网站| 亚洲性感美女99在线| 欧美一区二区三区视频| 影音先锋成人资源站| 亚洲黄色在线观看| 欧美久久久久久久久| 日韩午夜剧场| 美女精品在线观看| 在线亚洲欧美专区二区| 国产美女精品视频| 另类成人小视频在线| 一区二区精品在线| 蜜桃av综合| 亚洲欧美日韩精品一区二区| 亚洲东热激情| 国产精品一区二区久久久| 欧美电影免费观看高清完整版| 亚洲视频在线看| 亚洲高清色综合| 亚洲欧美日韩精品综合在线观看| 亚洲第一精品久久忘忧草社区| 欧美视频不卡| 欧美/亚洲一区| 久久国产精品99国产精| 一区二区激情视频| 最近中文字幕mv在线一区二区三区四区| 欧美一区二区三区视频| 宅男66日本亚洲欧美视频 | 一区二区三区欧美成人| 欧美成人一区二区三区| 久久精品成人| 午夜精品久久久久久久男人的天堂| 亚洲国产视频直播| 国产亚洲欧美日韩日本| 欧美先锋影音| 欧美高清在线视频| 久久综合伊人77777蜜臀| 亚洲欧美日韩一区二区在线| 亚洲精品久久视频| 亚洲电影网站| 欧美**字幕| 久久在线免费视频| 久久久久九九九九| 久久成人免费| 久久久久久999| 亚洲一区二区成人| 一本大道久久a久久精二百| 在线日韩中文字幕| 激情综合色丁香一区二区| 国产一在线精品一区在线观看| 国产精品高潮呻吟久久av黑人| 欧美日韩亚洲精品内裤| 欧美日韩免费一区二区三区视频| 欧美福利小视频| 欧美激情一区二区三区四区| 欧美精品www在线观看| 欧美成人自拍| 欧美大片专区| 欧美另类videos死尸| 欧美国产欧美综合 | 国产日产欧产精品推荐色| 欧美性猛交99久久久久99按摩| 欧美日韩国产精品自在自线| 欧美欧美全黄| 欧美午夜精品久久久久久超碰| 欧美午夜免费电影| 国产精品视频不卡| 国产日韩av高清| 国模精品一区二区三区| 国内精品久久久久影院色| 欧美一区二区三区日韩| 亚洲在线视频免费观看| 亚洲欧美文学| 午夜亚洲影视| 久久精品亚洲一区二区三区浴池| 久久9热精品视频| 久久精品国产精品| 美女网站久久| 亚洲高清成人| 亚洲美女少妇无套啪啪呻吟| 亚洲美女免费精品视频在线观看| 一区二区三区高清在线| 亚洲欧美中文另类| 久久精品欧洲| 免费观看国产成人| 欧美日韩免费视频| 国产欧美日韩视频一区二区| 亚洲国产日韩一级| 尤物九九久久国产精品的分类| 亚洲国产精品成人久久综合一区| 日韩视频在线一区| 香蕉久久精品日日躁夜夜躁| 久久精品视频免费| 亚洲国产cao| 在线视频你懂得一区二区三区| 欧美一级一区| 欧美精品免费在线| 国产精品永久免费| 一色屋精品视频在线看| 99精品视频免费观看| 欧美中文字幕在线播放| 亚洲第一视频网站| 亚洲欧美日韩专区| 麻豆成人91精品二区三区| 欧美色区777第一页| 一区二区在线免费观看| 亚洲一区二区三区免费在线观看| 老牛影视一区二区三区| 一本到高清视频免费精品| 久久久久久久久久久久久女国产乱| 欧美日本国产精品| 黄网站免费久久| 亚洲综合视频一区| 女主播福利一区| 亚洲亚洲精品三区日韩精品在线视频| 久久亚洲视频| 国产精品久久久亚洲一区| 欧美激情一二三区| 国产午夜精品一区理论片飘花| 亚洲毛片一区二区| 久久美女艺术照精彩视频福利播放| 亚洲激情综合| 久久国内精品自在自线400部| 国产精品99免视看9| 在线精品视频在线观看高清| 亚洲免费婷婷| 亚洲精品偷拍| 欧美电影免费观看| 在线精品视频一区二区| 久久久精品国产一区二区三区| 一区二区三区四区国产| 免费久久久一本精品久久区| 国产一区二区三区成人欧美日韩在线观看| 9人人澡人人爽人人精品| 欧美成人官网二区| 欧美午夜视频| 精品av久久707| 久久精品国产99| 一区二区三区日韩欧美精品| 欧美高清你懂得| 亚洲第一在线视频| 久久久久久9| 午夜精品视频一区| 国产精品香蕉在线观看| 一区二区三区久久久| 亚洲高清在线视频| 久久综合福利| 极品中文字幕一区| 久久久999精品免费| 亚洲欧美国产一区二区三区| 欧美色区777第一页| 国产精品99久久久久久久久久久久| 亚洲大片在线| 欧美国产在线电影| 亚洲剧情一区二区| 亚洲激情网址| 欧美精品激情| 国产精品99久久99久久久二8 | 国产日韩欧美一区在线 | 老司机凹凸av亚洲导航| 亚洲欧美日韩在线高清直播| 国产精品一二三| 欧美一区激情| 欧美一级专区| 狠狠色狠狠色综合日日91app| 久久久www免费人成黑人精品| 欧美一区二区播放| 激情文学一区| 欧美激情中文字幕一区二区| 麻豆精品视频| 日韩一级大片| 一区二区三区四区国产| 国产欧美日韩综合| 久久精品国亚洲| 久久精品99无色码中文字幕| 国产一区二区三区成人欧美日韩在线观看 | 亚洲综合成人婷婷小说| 国产乱人伦精品一区二区| 欧美亚洲色图校园春色| 午夜欧美不卡精品aaaaa| 国产一区二区在线观看免费播放| 另类天堂av| 欧美黄色成人网| 亚洲已满18点击进入久久| 亚洲天堂免费观看| 国产亚洲aⅴaaaaaa毛片| 久久免费观看视频| 女生裸体视频一区二区三区| 一本色道久久综合一区| 亚洲影院污污.| 久久久在线视频| 亚洲人成在线播放| 一本色道久久88精品综合| 国产精品欧美在线| 美日韩精品免费| 欧美片第一页|