• <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>
             

            smart_ptr庫是Boost中比較小的庫之一,也是實(shí)際應(yīng)用中使用最頻繁的庫之一。下面結(jié)合這段時間對它的學(xué)習(xí)了解,梳理Boost/smart_ptr庫的知識構(gòu)架。

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

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

            Boost/smart庫主要構(gòu)建了以下幾種智能指針:

                1.scoped_ptr

                2.scoped_array

                3.shared_ptr

                4.shared_array

                5.weap_ptr

            6.intrusive_ptr

                下面分別詳細(xì)介紹每種smart_ptr的用途。

            1.    scoped_ptr

            scoped_ptr是根據(jù)C++標(biāo)準(zhǔn)庫中的auto_ptr改進(jìn)過來的。Auto_ptr的一個很大的缺陷就是在賦值的時候會轉(zhuǎn)移操作權(quán)限,而scoped_ptr不會發(fā)生這樣的情況,原因在于scoped_prt根本就不允許賦值操作:

                private

            scoped_ptr(scoped_ptr const &);

                scoped_ptr & operator=(scoped_ptr const &);

            使用scope_ptr需要注意的地方:

            a.    scope_ptr只能從new操作符、0以及auto_ptr構(gòu)造。

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

            使用方法和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已經(jīng)轉(zhuǎn)移操作權(quán)限了,返回的是個裸指針
            29    p_auto2->f();
            30
            31    return 0;
            32}

            2.    scoped_array

            scoped_arrayscoped_ptr的數(shù)組形式的版本。scoped_array之所以是一個單獨(dú)的類而不是scoded_ptr的一個特化,這是因?yàn)樵幊碳夹g(shù)無法區(qū)分指向單個對象的指針和指向數(shù)組的指針,不管如何努力,還是沒有人能夠發(fā)現(xiàn)一種可靠的能區(qū)分這兩種形式指針的方法,這是因?yàn)閿?shù)組太容易退化成指針了而且沒有任何信息表明它指向數(shù)組。最后只能我們用scoped_array單獨(dú)處理指向數(shù)組的指針了,正如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是最有使用價值的智能指針了,它采用了非侵入式的引用技術(shù)技術(shù),幾乎可以取代平時工作中可能導(dǎo)致內(nèi)存泄漏的普通指針。另外它還提供了可自定義的析構(gòu)方法,這么一來,它幾乎可以安全管理所有資源了(包含文件,句柄等等)。值得欣慰的是,shared_ptrshared_array已經(jīng)被C++標(biāo)準(zhǔn)委員會接受,C++ 0x中應(yīng)該就會包含這個讓大家使用很方便的智能指針了。

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

            使用shared_ptr需要注意的地方:

            a.            shared_ptr可以從裸指針、另一個shared_ptr、std::auto_ptr或者weak_ptr構(gòu)造而來

            b.            shared_ptr的引用計(jì)數(shù)器來自堆分配。所以通過裸指針或者std::auto_ptr構(gòu)造時。可能會因?yàn)槎芽臻g不足而拋出std::bad_alloc的異常(非常小的幾率)

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

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

             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++標(biāo)準(zhǔn)容器中

            f.            最后附上shared_ptr的設(shè)計(jì)源碼,方面查閱

            4.    shared_array

            shared_arrayshared_ptr的數(shù)組形式,他們的關(guān)系就像scoped_ptrscoped_array的關(guān)系。shared_array的接口了shared_ptr的接口非常相似,但shared_array重載了下標(biāo)運(yùn)算符{},且不支持自定義的析構(gòu)方式。

            5.    weap_ptr

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

            暫時有點(diǎn)難懂,留下它的設(shè)計(jì)文檔以后需要的時候再研究。

            6.    intrusive_ptr

            intrusive_ptrshared_ptr的侵入式版本了,因?yàn)槭褂妙l率很低,暫時不做說明。

                總結(jié):Boost.Smart庫是一個非常非常優(yōu)秀的庫,是一個無論怎么評價都不為過的優(yōu)秀庫,值得學(xué)習(xí),值得廣泛應(yīng)用。

            Copyright © 天邊藍(lán)

            午夜肉伦伦影院久久精品免费看国产一区二区三区| 国产精品久久久久影院嫩草| 伊人久久大香线蕉亚洲| 91精品国产综合久久婷婷| 国产成人久久久精品二区三区| 久久久精品视频免费观看| 久久久久亚洲AV成人网人人网站| 69久久夜色精品国产69| 无码精品久久一区二区三区 | 久久久久久久99精品免费观看| 久久99精品国产麻豆不卡| 狼狼综合久久久久综合网| 欧美日韩精品久久久免费观看| 久久国产精品99国产精| 四虎影视久久久免费| 国产精品久久亚洲不卡动漫| 久久只有这精品99| 狠狠综合久久综合中文88| 成人国内精品久久久久影院| 97视频久久久| 亚洲国产小视频精品久久久三级 | 久久99国产精一区二区三区| 久久久久免费精品国产| 久久午夜福利电影| 国内精品久久久久久麻豆| 久久精品国产99国产电影网 | 精品久久8x国产免费观看| 77777亚洲午夜久久多喷| 欧美激情精品久久久久久| 久久国产V一级毛多内射| 国产成人无码精品久久久久免费| 久久国产精品国产自线拍免费| 97久久国产亚洲精品超碰热| 日韩av无码久久精品免费| 久久精品亚洲一区二区三区浴池| 久久青青草视频| 婷婷久久五月天| 波多野结衣AV无码久久一区| 久久亚洲日韩精品一区二区三区| 久久国产精品99精品国产| 久久久九九有精品国产|