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

Boost.Smart庫學習筆記

Posted on 2009-07-23 10:53 天邊藍 閱讀(833) 評論(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庫是一個非常非常優秀的庫,是一個無論怎么評價都不為過的優秀庫,值得學習,值得廣泛應用。

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>
            久久日韩粉嫩一区二区三区| 欧美日韩不卡一区| 中文成人激情娱乐网| 欧美日韩午夜精品| 欧美日韩一区二区在线播放| 欧美日韩一区在线观看视频| 欧美日韩国产在线播放网站| 欧美午夜在线观看| 国产精品一区一区三区| 国内外成人在线视频| 亚洲国产另类久久精品| 亚洲精品免费在线观看| 一本到高清视频免费精品| 亚洲一区二区三区视频播放| 欧美在线视频日韩| 久久久久一区二区| 91久久亚洲| 亚洲精品国产系列| 欧美一区二区视频免费观看| 美女免费视频一区| 国产精品色一区二区三区| 亚洲大胆av| 午夜天堂精品久久久久 | 欧美国产日韩一区二区三区| 欧美深夜福利| 好吊一区二区三区| 99综合电影在线视频| 久久aⅴ国产欧美74aaa| 亚洲高清久久| 欧美亚洲一区| 欧美人与性动交α欧美精品济南到 | 亚洲欧洲一区二区三区| 午夜精品国产精品大乳美女| 欧美激情成人在线视频| 亚洲欧美日韩精品久久久久| 欧美精品网站| 韩国欧美一区| 午夜亚洲视频| 99成人在线| 久久一区二区三区av| 国产精品免费视频xxxx| 在线亚洲激情| 亚洲综合99| 国产精品亚洲精品| 亚洲国产成人在线| 久久成人精品无人区| 99综合精品| 欧美激情一区二区三级高清视频| 国产日产欧美a一级在线| 亚洲图中文字幕| 亚洲人成高清| 欧美好吊妞视频| 亚洲国内精品在线| 欧美大片免费看| 久久久久久久波多野高潮日日| 国产九九视频一区二区三区| 亚洲小说区图片区| 一区二区三区视频在线看| 欧美日韩高清在线一区| 亚洲精选一区| 亚洲人成毛片在线播放| 欧美国产国产综合| 一本色道久久99精品综合| 免费观看日韩| 免费观看亚洲视频大全| 亚洲精品在线一区二区| 亚洲精品午夜| 国产精品久久久| 欧美制服丝袜| 久久久精品午夜少妇| 亚洲成人自拍视频| 亚洲国产婷婷| 国产精品v欧美精品v日韩| 亚洲欧美日韩国产综合精品二区| 亚洲一线二线三线久久久| 国产午夜精品理论片a级探花| 久久久久久久久伊人| 久久亚洲视频| 99精品热视频| 亚洲视频精选在线| 国产伊人精品| 亚洲国产mv| 国产精品久久久久久久久久妞妞 | 久久精品国产亚洲5555| 久久夜色精品国产亚洲aⅴ| 亚洲成人原创| 一区二区精品| 黄网站免费久久| 亚洲国产婷婷| 欧美特黄视频| 久久久久久香蕉网| 欧美激情视频在线免费观看 欧美视频免费一| 在线播放豆国产99亚洲| 亚洲激情国产精品| 国产片一区二区| 欧美风情在线| 国产精品永久在线| 亚洲第一精品夜夜躁人人爽 | 欧美日韩一区二区在线视频 | 欧美成人精品一区二区三区| 欧美激情在线播放| 久久免费黄色| 亚洲精品国产精品国自产观看浪潮| 一区二区三区国产精华| 怡红院精品视频| 亚洲视频在线视频| 欧美午夜不卡视频| 久久午夜电影| 欧美精品在线观看播放| 久久精品女人的天堂av| 欧美色播在线播放| 毛片一区二区| 国产欧美日韩91| 最近看过的日韩成人| 国内精品久久久久久影视8| 日韩午夜av电影| 亚洲第一偷拍| 午夜视频一区二区| 99爱精品视频| 久久亚洲综合网| 久久久免费av| 国产精品xnxxcom| 91久久精品国产91性色| 狠狠色噜噜狠狠色综合久 | 亚洲欧美色婷婷| 欧美国产日韩亚洲一区| 欧美成人自拍视频| 国产一区二区无遮挡| 亚洲午夜激情网站| 亚洲一区二区三区免费观看| 美国十次成人| 亚洲福利视频一区二区| 在线精品国产欧美| 久久综合久久综合久久综合| 久久午夜羞羞影院免费观看| 国产亚洲永久域名| 欧美资源在线观看| 久久久久高清| 伊人成人在线视频| 久久久久.com| 欧美成人首页| 亚洲日本va午夜在线影院| 免费成人黄色av| 亚洲韩国日本中文字幕| 一本色道综合亚洲| 欧美性片在线观看| 亚洲你懂的在线视频| 久久久99久久精品女同性| 狠狠色丁香婷婷综合久久片| 久久综合伊人| 亚洲国产视频a| 日韩一级裸体免费视频| 国产精品v欧美精品v日韩精品| 亚洲永久免费| 久久婷婷久久| 亚洲人成在线免费观看| 国产精品chinese| 午夜激情一区| 欧美激情无毛| 一个人看的www久久| 亚洲第一天堂av| 欧美肥婆在线| 亚洲欧美久久久| 国产日韩亚洲欧美精品| 久久久久久久97| 亚洲精品一线二线三线无人区| 亚洲视频在线二区| 好吊色欧美一区二区三区四区| 老鸭窝91久久精品色噜噜导演| 亚洲日本欧美天堂| 午夜亚洲视频| 亚洲人成网站精品片在线观看| 欧美日韩一区二区视频在线| 欧美在线亚洲在线| 亚洲免费观看高清完整版在线观看熊 | 免费亚洲电影在线| 亚洲视频每日更新| 在线精品视频一区二区| 国产精品午夜在线| 欧美成人国产| 欧美中文字幕在线播放| aa日韩免费精品视频一| 欧美黄污视频| 久久深夜福利免费观看| 亚洲一本视频| 亚洲毛片一区| 亚洲国产精品传媒在线观看 | 欧美日韩另类字幕中文| 欧美有码在线观看视频| 99这里只有久久精品视频| 亚洲第一页中文字幕| 久久综合九色综合欧美狠狠| 午夜亚洲伦理| 亚洲视频欧洲视频| 亚洲日本在线视频观看| 尤物精品国产第一福利三区| 国产婷婷一区二区| 国产精品久在线观看| 欧美日韩激情网| 欧美成人有码|