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

 

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>
            午夜免费日韩视频| 免费欧美日韩国产三级电影| 国外成人在线| 亚洲国产岛国毛片在线| 亚洲电影观看| 亚洲精品资源| 亚洲一区二区三区免费观看| 欧美一区二区成人| 久久riav二区三区| 免费观看成人网| 亚洲激情成人网| 日韩午夜精品| 亚洲欧美在线x视频| 久久久午夜视频| 欧美日韩精品一区二区天天拍小说| 国产精品v欧美精品v日本精品动漫| 亚洲人成在线影院| 国产日韩欧美综合一区| 韩日欧美一区二区三区| 99视频精品在线| 久久久久久一区| 亚洲欧洲日韩在线| 欧美亚洲日本一区| 欧美精品在线视频观看| 黄色精品网站| 午夜精品视频| 欧美电影在线| 欧美亚洲一级片| 欧美区一区二| 伊人春色精品| 欧美一区二区在线视频| 亚洲人成精品久久久久| 久久精品99无色码中文字幕| 欧美午夜精品一区| 亚洲国产精品国自产拍av秋霞| 亚洲欧美日韩区| 亚洲精品在线视频| 麻豆精品一区二区综合av| 国产美女精品在线| 亚洲图片欧洲图片av| 欧美成人嫩草网站| 欧美一级在线亚洲天堂| 国产精品高潮在线| 99ri日韩精品视频| 亚洲第一福利在线观看| 久久久久久色| 加勒比av一区二区| 久久精品1区| 亚洲一区二区在线视频 | 亚洲国产成人av| 久久国产精品免费一区| 国产视频久久久久| 久久av老司机精品网站导航| 亚洲图色在线| 国产精品区二区三区日本| 亚洲字幕一区二区| 一区二区三区免费观看| 欧美亚韩一区| 亚洲欧美激情视频| 亚洲一区二区三| 国产麻豆91精品| 久久精品视频va| 久久精品国产精品亚洲精品| 国产一区二区中文| 老司机一区二区三区| 久久久久久久久久久一区| 一区二区三区在线免费播放| 免费h精品视频在线播放| 久久人人97超碰国产公开结果| 在线观看亚洲一区| 欧美黄色一区| 欧美日韩在线三区| 欧美综合二区| 久久久蜜桃一区二区人| 久久午夜精品一区二区| 久久伊人亚洲| 亚洲精品国产精品乱码不99| 亚洲激情一区二区三区| 欧美日韩日本视频| 午夜亚洲视频| 久久免费的精品国产v∧| 91久久在线观看| 99re热精品| 国产亚洲免费的视频看| 免费一级欧美在线大片| 欧美国产综合一区二区| 午夜精品久久久久久久久久久| 欧美亚洲免费| 日韩视频免费看| 亚洲永久精品国产| 亚洲第一天堂av| 亚洲无吗在线| 亚洲国产精品一区| 亚洲视频一区二区免费在线观看| 黄色成人在线免费| 日韩视频精品在线| 韩国一区二区三区美女美女秀| 亚洲精华国产欧美| 国产亚洲精品久久久久久| 欧美电影电视剧在线观看| 欧美日韩喷水| 免费成人美女女| 国产精品久久中文| 欧美激情导航| 国产主播一区二区三区| 99精品免费网| 亚洲国产美女精品久久久久∴| 亚洲一区二区伦理| 亚洲精品一区二区在线| 性欧美超级视频| 亚洲一区二区三区在线观看视频| 久久久999| 欧美在线啊v| 国产精品电影在线观看| 亚洲高清在线观看| 国产原创一区二区| 中文在线资源观看网站视频免费不卡| 激情国产一区| 欧美一级久久久| 亚洲一区二区在线播放| 欧美精品在线一区| 欧美电影专区| 亚洲电影免费在线| 久久精品国产999大香线蕉| 午夜精品一区二区三区在线播放 | 久久精精品视频| 久久av一区二区三区| 欧美午夜视频在线| 日韩一级视频免费观看在线| 日韩一级片网址| 欧美巨乳在线| 亚洲理论在线| 亚洲图片欧洲图片av| 欧美日韩黄视频| 99国产精品久久久久久久成人热 | 快射av在线播放一区| 国产中文一区| 欧美视频中文在线看| 另类尿喷潮videofree | 亚洲专区免费| 欧美视频免费在线观看| 亚洲伦理在线| 亚洲视频999| 国产精品久久7| 亚洲欧美在线磁力| 久久av一区二区| 狠狠入ady亚洲精品经典电影| 久久精品国产久精国产爱| 蜜臀99久久精品久久久久久软件| 在线观看亚洲视频| 久久夜色精品一区| 亚洲国产一区二区a毛片| 亚洲精品日韩精品| 欧美精品激情| 亚洲午夜精品一区二区| 欧美专区日韩视频| 韩日成人av| 欧美激情精品久久久久久变态| 亚洲精品婷婷| 欧美在线中文字幕| 狠狠久久亚洲欧美| 欧美激情欧美激情在线五月| 一区二区高清视频| 久久婷婷一区| 亚洲色无码播放| 红桃av永久久久| 欧美精品综合| 欧美一区二区三区免费观看| 女人色偷偷aa久久天堂| 亚洲天堂免费观看| 韩国精品久久久999| 欧美福利电影在线观看| 亚洲免费中文| 亚洲欧洲日本mm| 久久久91精品国产一区二区精品| 亚洲毛片播放| 国内视频一区| 欧美色区777第一页| 欧美一区三区三区高中清蜜桃 | 欧美体内she精视频| 欧美综合二区| 99综合视频| 欧美顶级艳妇交换群宴| 午夜精品一区二区三区在线视| 亚洲国产影院| 国产日韩欧美视频| 欧美黄色成人网| 久久精品国产精品亚洲综合| 99亚洲精品| 欧美国产日韩一区二区在线观看 | 久久久国产午夜精品| 一本色道久久99精品综合| 激情综合激情| 国产精品私拍pans大尺度在线| 男人插女人欧美| 欧美一区二区三区男人的天堂| 99re视频这里只有精品| 欧美大片免费观看| 久久久999精品视频| 欧美日韩精品一区二区三区|