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

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>
            久久久www免费人成黑人精品| 亚洲午夜久久久久久久久电影院| 国产自产女人91一区在线观看| 亚洲精品美女在线观看| 久久精品综合网| 亚洲欧美在线免费| 国产精品久久久久av免费| 亚洲日韩成人| 91久久中文字幕| 久久精品亚洲精品| 国产午夜亚洲精品不卡| 亚洲欧美成人一区二区三区| 亚洲乱码精品一二三四区日韩在线 | 欧美精品日韩www.p站| 黑人巨大精品欧美黑白配亚洲 | 欧美gay视频激情| 久久九九全国免费精品观看| 国产亚洲成精品久久| 欧美中文字幕在线播放| 欧美日韩一区二区高清| 在线观看亚洲a| 欧美第十八页| 欧美成人综合| 一区二区三区欧美在线观看| 99re8这里有精品热视频免费| 欧美另类视频| 亚洲综合视频一区| 性欧美精品高清| 黄色亚洲在线| 国产真实久久| 免费不卡在线视频| 久久中文字幕导航| 亚洲精品国产精品久久清纯直播| 99国产精品久久| 国产欧美一级| 亚洲精品在线观| 一区二区福利| 欧美大尺度在线观看| 久久嫩草精品久久久精品| 狠狠久久婷婷| 亚洲电影观看| 国产精品毛片va一区二区三区 | 欧美手机在线视频| 在线亚洲一区| 亚洲一区二区三区在线视频| 国产亚洲欧洲| 亚洲精品1区| 国产酒店精品激情| 欧美成人午夜免费视在线看片| 欧美国产日本韩| 亚洲欧美在线磁力| 久久久最新网址| 一区二区欧美视频| 午夜宅男久久久| 日韩一级免费观看| 久久精品99久久香蕉国产色戒| 99精品久久| 久久人人精品| 久久精品观看| 欧美偷拍一区二区| 欧美成人在线影院| 国产精品一区二区久久| 亚洲高清自拍| 一区二区在线视频播放| 日韩视频免费看| 在线精品视频一区二区三四| 亚洲最新在线| 在线成人h网| 亚洲一区二区三区视频| 亚洲国产精品视频一区| 欧美亚洲综合网| 亚洲一区三区在线观看| 欧美91精品| 欧美成人综合网站| 国产自产2019最新不卡| 99riav久久精品riav| 极品裸体白嫩激情啪啪国产精品| 亚洲免费观看高清完整版在线观看熊| 狠狠色综合网| 中文在线一区| 一区二区三区免费看| 麻豆成人小视频| 久久婷婷麻豆| 激情欧美国产欧美| 国产乱码精品一区二区三区av| 亚洲精品视频在线| 蜜臀久久99精品久久久画质超高清| 亚洲人成艺术| 国产性色一区二区| 欧美成人一区二免费视频软件| 欧美中文在线免费| 亚洲小说欧美另类社区| 午夜激情综合网| 亚洲啪啪91| 亚洲国产精品成人综合| 久久av免费一区| 久久成人精品无人区| 欧美肉体xxxx裸体137大胆| 免费不卡在线观看| 激情六月婷婷综合| 久久精品一区| 男同欧美伦乱| 亚洲日韩欧美视频一区| 欧美日韩成人一区| 99riav1国产精品视频| 亚洲视频观看| 欧美性开放视频| 一区二区三区高清在线观看| 亚洲一区二区三区中文字幕| 国产精品va| 午夜久久资源| 麻豆久久久9性大片| 亚洲国产精品999| 美腿丝袜亚洲色图| 亚洲激情网站| 亚洲一区二区伦理| 国产精品毛片a∨一区二区三区| 亚洲综合精品一区二区| 久久久国产成人精品| 加勒比av一区二区| 欧美激情亚洲另类| 亚洲午夜免费视频| 六月婷婷一区| 夜夜嗨av一区二区三区四区| 国产精品久久久免费| 久久精品女人天堂| 亚洲欧洲一区二区三区在线观看| 亚洲视频 欧洲视频| 国产伦精品一区二区三区视频黑人 | 国产亚洲第一区| 久久久国产精品亚洲一区| 亚洲国产精品va在线观看黑人 | 亚洲欧美综合精品久久成人| 美女视频网站黄色亚洲| 亚洲免费观看在线观看| 国产精品国产三级国产| 久久久久久久一区二区| 一区二区冒白浆视频| 国产偷自视频区视频一区二区| 久久久人成影片一区二区三区| 最新国产精品拍自在线播放| 午夜免费日韩视频| 亚洲国产高清视频| 欧美精品v国产精品v日韩精品| 亚洲视频专区在线| 欧美视频在线观看免费| 国产婷婷色一区二区三区在线| 玉米视频成人免费看| 久久精品国语| 久久国内精品自在自线400部| 欧美日韩精品在线观看| 99视频国产精品免费观看| 欧美超级免费视 在线| 国产精品久99| 亚洲欧美日本国产专区一区| 亚洲欧美欧美一区二区三区| 久久综合福利| 欧美一区二区精美| 亚洲精品欧美激情| 亚洲第一精品在线| 国产一区二区电影在线观看| 欧美日韩理论| 欧美成人午夜激情在线| 欧美综合77777色婷婷| 亚洲一区二区三区四区在线观看| 欧美99久久| 六月婷婷一区| 久久久噜噜噜久久人人看| 午夜精品一区二区三区在线| 亚洲精品少妇网址| 亚洲精品国产品国语在线app | 欧美性猛交xxxx乱大交蜜桃 | 国产日本欧美一区二区| 欧美日韩三级在线| 欧美日韩精品免费观看视频完整 | 国产亚洲成av人在线观看导航| 国产精品国内视频| 欧美日韩国产首页在线观看| 蜜桃久久av| 欧美v日韩v国产v| 免费国产自线拍一欧美视频| 久久这里有精品视频| 蜜桃av久久久亚洲精品| 欧美成人一区在线| 久久精品国亚洲| 欧美在线视频免费播放| 欧美一级欧美一级在线播放| 欧美一区视频在线| 久久久av毛片精品| 男人插女人欧美| 欧美久色视频| 国产精品久久久久aaaa| 国产欧美日韩免费看aⅴ视频| 国产老女人精品毛片久久| 国产精品日韩在线播放| 国产一区日韩二区欧美三区| 激情五月综合色婷婷一区二区| 亚洲承认在线| 一本久久综合| 久久激情综合网|