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

            Boost.Smart庫學習筆記

            Posted on 2009-07-23 10:53 天邊藍 閱讀(824) 評論(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 © 天邊藍

            亚洲精品乱码久久久久久按摩| 2021久久国自产拍精品| 亚洲欧美一区二区三区久久| 欧美日韩精品久久免费| 久久久久99精品成人片直播| 99久久国产主播综合精品| 国产成人综合久久精品红| 国产精品毛片久久久久久久| 热久久国产欧美一区二区精品| 久久精品亚洲一区二区三区浴池 | 久久免费视频观看| 久久亚洲天堂| 精品久久久久久| 亚洲国产精品无码久久久蜜芽| 国产精品狼人久久久久影院| 久久亚洲精精品中文字幕| 久久性生大片免费观看性| 国产精品毛片久久久久久久 | 青青草国产成人久久91网| 97精品伊人久久大香线蕉| 久久国产福利免费| 99久久无码一区人妻a黑| 久久受www免费人成_看片中文| 久久久综合九色合综国产| 久久久SS麻豆欧美国产日韩| 久久er国产精品免费观看8| 国产成人久久精品一区二区三区 | 国产精品成人99久久久久 | 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 国内精品久久久久久99| 久久久国产亚洲精品| 色婷婷久久综合中文久久一本| 久久―日本道色综合久久| 国内精品伊人久久久久AV影院| 综合人妻久久一区二区精品| 国产成人综合久久精品红| 2021国内精品久久久久久影院| 青青久久精品国产免费看| 亚洲Av无码国产情品久久| 久久夜色撩人精品国产小说| 久久人人爽人人爽人人片AV东京热|