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

 

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

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

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

Boost/smart庫(kù)主要構(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)庫(kù)中的auto_ptr改進(jìn)過(guò)來(lái)的。Auto_ptr的一個(gè)很大的缺陷就是在賦值的時(shí)候會(huì)轉(zhuǎn)移操作權(quán)限,而scoped_ptr不會(huì)發(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*操作時(shí)做好先判斷ptr是否為0.如果ptr=0*操作會(huì)導(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;//編譯錯(cuò)誤
28    p_auto->f();//p_auto已經(jīng)轉(zhuǎn)移操作權(quán)限了,返回的是個(gè)裸指針
29    p_auto2->f();
30
31    return 0;
32}

2.    scoped_array

scoped_arrayscoped_ptr的數(shù)組形式的版本。scoped_array之所以是一個(gè)單獨(dú)的類(lèi)而不是scoded_ptr的一個(gè)特化,這是因?yàn)樵幊碳夹g(shù)無(wú)法區(qū)分指向單個(gè)對(duì)象的指針和指向數(shù)組的指針,不管如何努力,還是沒(méi)有人能夠發(fā)現(xiàn)一種可靠的能區(qū)分這兩種形式指針的方法,這是因?yàn)閿?shù)組太容易退化成指針了而且沒(méi)有任何信息表明它指向數(shù)組。最后只能我們用scoped_array單獨(dú)處理指向數(shù)組的指針了,正如delete無(wú)法取代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

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

shared_ptr解決了共享對(duì)象什么時(shí)候刪除的問(wèn)題。讓C++程序員不用再想盡方法刪除共享對(duì)象了。

使用shared_ptr需要注意的地方:

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

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

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

d.            shared_ptr構(gòu)造的時(shí)候,允許傳遞釋放所存儲(chǔ)對(duì)象的方法,這就讓我們可以用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        //通過(guò)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的觀察者,它不會(huì)影響shared_ptr所共享資源的所有權(quán)。為什么需要weap_ptr?因?yàn)樵谠S多情況下,需要觀察某個(gè)共享資源但是又不想接受它的所有權(quán),例如為了打破循環(huán)依賴(lài)關(guān)系、為了觀察某個(gè)共享資源而不想接受它的所有權(quán)或者為了避免懸空指針時(shí),就需要使用weap_ptr

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

6.    intrusive_ptr

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

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


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


Copyright © 天邊藍(lán)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品日韩| 久久国产精品99国产精| 在线观看亚洲精品| 一区在线免费| 午夜精品福利一区二区三区av | 亚洲免费小视频| 欧美日韩一区二区精品| 校园激情久久| 久久久久久一区| 日韩一级免费观看| 在线亚洲欧美视频| 亚洲欧美在线免费观看| 欧美在线播放高清精品| 免费精品视频| 欧美性片在线观看| 亚洲午夜激情| 久久影音先锋| 欧美激情免费在线| 欧美成人小视频| 欧美激情1区2区| 亚洲第一综合天堂另类专| 亚洲精品一二| 欧美三级韩国三级日本三斤| 日韩一区二区福利| 久久精品亚洲热| 国产综合色在线| 欧美劲爆第一页| 亚洲在线成人| 欧美黄色网络| 在线观看日韩一区| 欧美视频一区二区三区四区| 亚洲自拍高清| 亚洲国产精品v| 欧美黄色大片网站| 亚洲综合精品一区二区| 欧美gay视频激情| 久热精品视频| 亚洲一二三区在线观看| 欧美精品日韩一本| 亚洲国产成人91精品| 午夜精品久久久久| 亚洲午夜影视影院在线观看| 欧美日本在线视频| 亚洲美女电影在线| 免费国产一区二区| 久久久精品tv| 亚洲黄色一区| 欧美激情第9页| 欧美区高清在线| 欧美一区二区精品久久911| 亚洲网址在线| 国产视频精品免费播放| 久久一区二区视频| 久久精品国产综合| 精品成人乱色一区二区| 久久久五月天| 欧美黑人多人双交| 欧美在线首页| 欧美国产精品人人做人人爱| 亚洲私拍自拍| 久久综合激情| 欧美在线综合| 欧美日韩国产限制| 久久精品视频免费播放| 欧美精品成人一区二区在线观看| 亚洲一区中文| 欧美精品一区二区三区蜜臀| 久久精品首页| 国产精品萝li| 亚洲精品乱码久久久久久| 国内偷自视频区视频综合| 日韩亚洲一区二区| 伊人影院久久| 久久大逼视频| 美女诱惑一区| 在线看欧美视频| 噜噜噜噜噜久久久久久91| 久久久91精品国产一区二区三区| 欧美午夜无遮挡| 99re66热这里只有精品4| 一区二区欧美激情| 欧美日韩在线直播| 日韩一级欧洲| 亚洲一区图片| 国产热re99久久6国产精品| 亚洲美女在线观看| 午夜精品福利一区二区蜜股av| 国产精品啊啊啊| 久久国产福利| 国产日韩欧美综合精品| 欧美一区二区在线看| 欧美1区2区| 蘑菇福利视频一区播放| 国产精品久久久久久久久久免费| 亚洲激情中文1区| 国产精品久久久久三级| 亚洲人成精品久久久久| 国产精品私房写真福利视频| 欧美二区在线播放| 欧美精品日韩www.p站| 欧美日韩国产黄| 国产精品电影在线观看| 欧美吻胸吃奶大尺度电影| 欧美美女喷水视频| 欧美精品aa| 国产精品久久9| 国产日韩亚洲欧美| 国产在线乱码一区二区三区| 亚洲国产欧美在线| 正在播放亚洲一区| 久久黄色影院| 欧美韩日精品| 国产精品99久久久久久有的能看 | 久久一区二区三区av| 欧美在线观看视频一区二区三区| 久久精品99| 国产伦一区二区三区色一情| 亚洲国产经典视频| 亚洲男人的天堂在线观看| 免费欧美高清视频| 欧美在线一级va免费观看| 久久国产福利| 欧美激情一区二区三区不卡| 欧美日一区二区三区在线观看国产免| 欧美午夜理伦三级在线观看| 欧美日韩国产色综合一二三四| 噜噜爱69成人精品| 免费欧美在线视频| 亚洲一区二区在线免费观看| 亚洲在线成人| 欧美国产免费| 国产伦一区二区三区色一情| 激情偷拍久久| 亚洲一区二区三区久久| 欧美国产综合视频| 久久蜜桃资源一区二区老牛| 久久国产婷婷国产香蕉| 日韩午夜电影| 亚洲免费在线观看视频| 久久亚洲影院| 99ri日韩精品视频| 欧美自拍丝袜亚洲| 国产精品一区二区三区久久久 | 亚洲网站视频| 欧美激情一区二区久久久| 性欧美超级视频| 国产午夜精品美女视频明星a级| 夜色激情一区二区| 亚洲人成久久| 国产精品久久久久久亚洲毛片| 亚洲视频高清| 亚洲综合国产| 亚洲美女91| 久久久久久婷| 久久精品国产2020观看福利| 欧美日韩成人免费| 亚洲欧美日韩国产中文 | 宅男精品视频| 一区二区三区我不卡| 亚洲国产福利在线| 欧美久久久久久蜜桃| 久久福利资源站| 欧美电影打屁股sp| 蜜桃av噜噜一区| 欧美jizz19性欧美| 香蕉乱码成人久久天堂爱免费| 一区二区三区在线视频观看| 91久久在线视频| 久久精品国产亚洲高清剧情介绍| 久久激情综合| 亚洲欧美一区二区三区在线| 1204国产成人精品视频| 一本大道久久a久久综合婷婷| 亚洲国产高清一区二区三区| 欧美在线综合视频| 久久婷婷丁香| 亚洲国产成人在线播放| 久久亚洲精品中文字幕冲田杏梨| 久久久久久欧美| 激情五月综合色婷婷一区二区| 欧美一区二区三区日韩| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美在线高清视频| 欧美不卡视频一区发布| 韩国精品一区二区三区| 午夜精品成人在线视频| 亚洲精品在线视频观看| 久热精品视频| 亚洲精品在线观看视频| 欧美成人一区二区| 欧美精品日韩三级| 亚洲永久在线观看| 欧美一区二区三区免费视频| 国产亚洲精品bv在线观看| 久久夜色精品一区| 美女成人午夜| 久久精品国产69国产精品亚洲| 性做久久久久久免费观看欧美| 国产精品一区二区久久久久| 久久久一二三|