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

隨筆 - 181  文章 - 15  trackbacks - 0
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

My Tech blog

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

        這一部分會將要討論一下auto_ptr.c++標(biāo)準(zhǔn)庫提供auto_ptr作為一種智能指針,有了這種智能指針,就可以在異常被拋出的時(shí)候避免資源的泄漏.注意,auto_ptr只是智能指針的一種.因?yàn)槭聦?shí)上有多種智能指針存在.而auto_ptr只是被用來滿足某種情形下的需求的.而對于其他一些情形,auto_ptr無能為力.所以在使用的時(shí)候 要格外注意.
        auto_ptr的動(dòng)機(jī)
        通常,一個(gè)函數(shù)會按照下面的流程進(jìn)行操作:
        1.獲取資源.
        2.進(jìn)行一些操作.
        3.釋放之前所獲取的資源.
        如果函數(shù)所獲取的那些資源與本地對象綁定,它們就會在函數(shù)結(jié)束的時(shí)候被自動(dòng)釋放掉.因?yàn)楸镜貙ο蟮奈鰳?gòu)函數(shù)會被調(diào)用.但是如果資源被顯式獲取,并且沒有與任何對象綁定,它們必須也被顯式的釋放掉.在使用指針的時(shí)候,資源通常是被顯式管理的.
        一種典型的像上面這樣使用資源的方式就是使用new來創(chuàng)建和用delete來釋放.
        但是作釋放用的delete操作往往被忽略(特別是函數(shù)有返回值的時(shí)候).當(dāng)然,出現(xiàn)異常的時(shí)候,也同樣會發(fā)生這種風(fēng)險(xiǎn).因?yàn)楫惓S锌赡荞R上停止你函數(shù)的執(zhí)行,而不去進(jìn)行delete釋放.結(jié)果就是內(nèi)存泄漏,或者說得寬泛一些,是"資源泄漏".為了避免資源泄漏,通常需要函數(shù)能夠捕獲所有的異常.隨之而來的就是,代碼變得越來越復(fù)雜,冗長.
        伴隨著這種情況的發(fā)生,一種智能指針auto_ptr出現(xiàn)了.在任何時(shí)候,一旦指針本身被銷毀,它所指向的數(shù)據(jù)也會被銷毀.此外,因?yàn)橹悄苤羔樖且粋€(gè)本地變量,不管函數(shù)到底是因?yàn)檎=Y(jié)束,還是因?yàn)榉钦=Y(jié)束,auto_ptr所指向的數(shù)據(jù)都會被銷毀.
        有了auto_ptr,delete語句和catch語句就變得不那么必要了.auto_ptr和普通指針的使用方式基本相同,即用樣用"*"表示它所指向的對象,同樣用"->"來訪問所指向?qū)ο蟮某蓡T方法.但是有關(guān)指針的運(yùn)算(比如指針的自加)不被支持(這也許是一個(gè)優(yōu)點(diǎn),因?yàn)橹羔樳\(yùn)算也許會造成一些麻煩).
        注意auto_ptr<>不允許你使用指派的方式來聲明它所指向的對象,比如:
        下面的操作是不允許的:
        std::auto_ptr<ClassA> ptr2 = new ClassA; //ERROR
        而應(yīng)該采用顯式的構(gòu)造函數(shù)來初始化:
        std::auto_ptr<ClassA> ptr1(new ClassA);  //OK
        通過auto_ptr來轉(zhuǎn)換所有權(quán)
        auto_ptr在語意上提供了對于所有全的嚴(yán)格約束.這意味著因?yàn)槿绻粋€(gè)auto_ptr刪除了它所指向的對象,那么這個(gè)對象將不會被其他任何對象所擁有.兩個(gè)或以上的auto_ptr絕不能同時(shí)擁有一個(gè)對象.不幸的是,這種情況是有可能出現(xiàn)的.所以只能有程序員來確保這種情況不會發(fā)生.
        那么在這種情況下,auto_ptr的拷貝構(gòu)造函數(shù)如何工作呢?通常它會把一個(gè)對象的數(shù)據(jù)復(fù)制給另外一個(gè)對象,但是在這里,恰恰是這種行為會導(dǎo)致兩個(gè)auto_ptr擁有相同對象這種情況的出現(xiàn).解決方法很簡單,但是卻得出了一個(gè)重要結(jié)論:auto_ptr的拷貝構(gòu)造函數(shù)和指派操作促成了auto_ptr對于對象所有權(quán)的一次移交.
        看一下下面的代碼:
        //initialize an auto_ptr with a new object
        std::auto_ptr<ClassA> ptr1(new ClassA);
        //copy the auto_ptr
        //- transfers ownership from ptr1 to ptr2
        std::auto_ptr<ClassA> ptr2(ptr1);
        第一句中,ptr1擁有new所創(chuàng)建的那個(gè)對象.然后第二句把對于對象的所有權(quán)從ptr1轉(zhuǎn)移給了ptr2.所以在第二句之后,ptr2擁有new創(chuàng)建的那個(gè)對象的所有權(quán),而ptr1則自動(dòng)失去了對于那個(gè)對象的所有權(quán).ClassA只會在ptr2被析構(gòu)的時(shí)候被釋放掉.
        同樣,對于一次指派操作也是如此.如下所示:
        //initialize an auto_ptr with a new object
        std::auto_ptr<ClassA> ptr1(new ClassA);
        std::auto_ptr<ClassA> ptr2; //create another auto_ptr
        ptr2 = ptr1;        //assign the auto_ptr
                                  //- transfers ownership from ptr1 to ptr2
        注意,隨著所有權(quán)的移交,之前失去對象所有權(quán)的那個(gè)auto_ptr就變成了一個(gè)空指針.
        當(dāng)然,還可以讓這個(gè)失去所指的空指針重新指向一個(gè)對象,像下面這樣:
        std::auto_ptr<ClassA> ptr;               //create an auto_ptr
        ptr = std::auto_ptr<ClassA>(new ClassA); //OK, delete old object and own new
        對于所指向的對象的所有權(quán)的變換為我們提供了auto_ptr的一種潛在用法.函數(shù)可以使用向其他的函數(shù)傳遞所有權(quán).這包含兩種情況.
        1.傳入函數(shù)的對象不再使用.即在auto_ptr作為參數(shù)傳遞的時(shí)候.在這種情況下,被調(diào)用的函數(shù)得到了傳入的auto_ptr所指向的那個(gè)對象的所有權(quán).因此,如果函數(shù)不再將對象的所有權(quán)轉(zhuǎn)移出來,那么對象就會在函數(shù)的調(diào)用結(jié)束之后銷毀.
         2.函數(shù)要向外傳出對象.當(dāng)auto_ptr被返回的時(shí)候,所有權(quán)由被調(diào)用的函數(shù)轉(zhuǎn)移給調(diào)用方.
         由于auto_ptr總是牽扯到對象所有權(quán)變換的問題,所以在使用的時(shí)候一定要注意你是否真的要轉(zhuǎn)換這個(gè)所有權(quán).
         你可能打算通過引用傳遞auto_ptr(s).但是這樣做有可能最終你都不清楚所有權(quán)的歸屬了.總之,這不是一個(gè)好的決定或設(shè)計(jì).
        從auto_ptr的概念出發(fā),你可能會覺得即使是傳遞常指針的話,對象的歸屬也會改變.如果這種情況可能發(fā)生,那將是非常危險(xiǎn)的.因?yàn)槿藗兛偸遣黄诖粋€(gè)成為"常量"的東西發(fā)生改變.幸運(yùn)的是,通過一些技術(shù)上的處理,這樣做是不可能的.如:
       
 1 #include<iostream>
 2 using namespace std;
 3 int getValue(auto_ptr<int>);
 4 int main()
 5 {
 6     const auto_ptr<int> myAutoPtr=auto_ptr<int>(new int);
 7     *myAutoPtr=10;
 8     cout<<getValue(myAutoPtr)<<endl;
 9     
10 }
11 int getValue(auto_ptr<int> ptr)
12 {
13     return 10*(*ptr);
14 }
       上面首先定義了常量的auto_ptr,這就表明,這個(gè)auto_ptr不能將自己所指對象的所有權(quán)傳遞給其他對象.因而調(diào)用函數(shù)getValue的時(shí)候如果傳遞了上面定義的auto_ptr,就會被編譯器發(fā)現(xiàn),并作為編譯錯(cuò)誤反饋回來:
錯(cuò)誤: passing ‘const std::auto_ptr<int>’ as ‘this’ argument of ‘std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = int, _Tp = int]’ discards qualifiers
將auto_ptr(s)作為成員變量
當(dāng)然,如果在類中使用auto_ptr的時(shí)候,你同樣也可以避免資源泄漏這種問題的發(fā)生.如果你使用auto_ptr取代通常的指針的話,你將不再需要對那些對象進(jìn)行手動(dòng)的析構(gòu)處理.同時(shí),auto_ptr也能夠有效避免因?yàn)槌跏蓟惓6鴮?dǎo)致資源泄漏這種情況的發(fā)生.因?yàn)槲鰳?gòu)總是在構(gòu)造之后,所以如果在構(gòu)造的時(shí)候發(fā)生異常,你往往不能夠及時(shí)釋放資源,進(jìn)而導(dǎo)致資源泄漏情況的發(fā)生.
        但是,在享用了auto_ptr帶來的諸多好處的同時(shí),你在處理拷貝構(gòu)造函數(shù)和重載賦值操作的時(shí)候,要格外注意auto_ptr所有權(quán)變換的問題.當(dāng)然,避免這類問題的最好方法就是使用常量指針.
        有關(guān)auto_ptr(s)的濫用
        auto_ptr能夠滿足一些需要,特別是容易發(fā)生資源泄漏的時(shí)候,它總能夠發(fā)揮好的效果.但是在使用它的時(shí)候仍然需要注意,不要濫用.在使用的時(shí)候,要注意以下幾點(diǎn):
        1.auto_ptr(s)不能夠共享對于所指向?qū)ο蟮乃袡?quán).
        2auto_ptr(s)不提供對于數(shù)組的支持.因?yàn)樵卺尫刨Y源的時(shí)候,auto_ptr使用的是delete而不是delete[].當(dāng)然,對于數(shù)組而言,STL也有相應(yīng)的處理辦法,比如容器.
        3.auto_ptr(s)不是智能指針的全部.注意它并不能解決一切問題.注意它的應(yīng)用場景.
        4.auto_ptr(s)不能滿足容器中對象的操作要求.

       







       

posted on 2007-07-12 22:46 littlegai 閱讀(366) 評論(0)  編輯 收藏 引用 所屬分類: 我的讀書筆記
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品亚洲精品| 1024国产精品| 欧美一区午夜精品| 亚洲一区二区视频在线| 国产精品网站在线播放| 久久激情网站| 久久久久久久高潮| 亚洲国产成人不卡| 亚洲精品国久久99热| 免费观看久久久4p| 一本久道久久综合狠狠爱| 亚洲免费播放| 国产精品一区二区你懂的| 老牛嫩草一区二区三区日本| 男女精品视频| 亚洲欧美日韩国产另类专区| 久久本道综合色狠狠五月| 在线观看日韩欧美| 99国产精品国产精品久久| 国产欧美日韩亚洲一区二区三区| 麻豆成人在线播放| 欧美日韩精品二区| 久久精品成人| 欧美经典一区二区| 香蕉视频成人在线观看| 久久在线视频| 欧美亚洲综合网| 免费av成人在线| 性欧美超级视频| 欧美www在线| 久久精品日韩一区二区三区| 牛人盗摄一区二区三区视频| 欧美在线精品一区| 欧美母乳在线| 欧美xx69| 国产在线日韩| 亚洲一级影院| 一区二区三区欧美日韩| 久久久噜噜噜久久久| 亚洲男人的天堂在线aⅴ视频| 久久嫩草精品久久久久| 新狼窝色av性久久久久久| 欧美麻豆久久久久久中文| 久久天天躁夜夜躁狠狠躁2022 | 亚洲桃色在线一区| **欧美日韩vr在线| 欧美亚洲免费高清在线观看| 在线视频亚洲欧美| 欧美成人午夜激情在线| 久久综合久久久久88| 国产精品资源| 亚洲一区二区综合| 亚洲制服少妇| 欧美午夜电影在线| 91久久久久久久久久久久久| 一区二区亚洲精品| 久久精品99国产精品日本| 欧美在线你懂的| 国产精品毛片| 亚洲永久视频| 欧美亚洲自偷自偷| 国产日韩欧美三级| 性欧美xxxx大乳国产app| 欧美亚洲一区二区在线| 国产精品婷婷| 午夜在线精品偷拍| 久久国产精品亚洲va麻豆| 国产精品v欧美精品v日本精品动漫| 亚洲国产欧美国产综合一区| 91久久精品www人人做人人爽| 另类春色校园亚洲| 亚洲国产精品尤物yw在线观看| 在线播放豆国产99亚洲| 久久综合久久久久88| 欧美激情亚洲一区| 一区二区欧美在线观看| 欧美日韩国产成人在线| 在线亚洲观看| 欧美中文字幕不卡| 激情久久中文字幕| 欧美成人日韩| av成人免费在线| 欧美在线免费播放| 永久免费精品影视网站| 欧美国产91| 亚洲一区日本| 久久亚洲图片| av成人毛片| 国产精品久久一区二区三区| 欧美在线亚洲一区| 亚洲高清毛片| 小黄鸭精品密入口导航| 狠狠色丁香婷婷综合影院| 另类尿喷潮videofree| 91久久国产综合久久| 亚洲免费影视| 国内成人自拍视频| 欧美高清在线观看| 亚洲午夜视频在线观看| 鲁大师成人一区二区三区| 亚洲精品欧美专区| 国产午夜精品美女毛片视频| 蜜桃av一区| 亚洲永久视频| 亚洲欧洲日韩在线| 久久久精品免费视频| 日韩天天综合| 国产在线观看91精品一区| 欧美大片一区二区三区| 亚洲在线成人| 亚洲精品网址在线观看| 久久精品国产99| 亚洲视频1区| 最新成人av网站| 国产亚洲欧美日韩美女| 欧美日韩在线一区二区| 久久视频在线看| 亚洲午夜久久久久久久久电影院 | 亚洲精品国久久99热| 久久久高清一区二区三区| 99国产精品久久| 亚洲高清二区| 精品动漫3d一区二区三区| 国产精品久久久久一区二区三区 | 亚洲调教视频在线观看| 亚洲国产成人av好男人在线观看| 久久久精品2019中文字幕神马| 日韩午夜激情av| 亚洲国产精品一区在线观看不卡| 国产日韩欧美成人| 国产精品嫩草99av在线| 欧美精品激情在线| 欧美电影免费观看高清| 久久免费观看视频| 久久精品人人爽| 欧美一区二区精品| 亚洲欧美另类国产| 亚洲一区欧美| 中文国产成人精品| 一区二区三区高清在线 | 久久爱www久久做| 午夜精品美女自拍福到在线| 中文成人激情娱乐网| 亚洲茄子视频| 亚洲毛片在线观看.| 亚洲精品欧美激情| 亚洲韩国一区二区三区| 精品88久久久久88久久久| 激情欧美丁香| 亚洲国产天堂久久综合| 亚洲激情视频在线| 日韩视频免费| 一区二区三区欧美| 亚洲影院色在线观看免费| 亚洲字幕一区二区| 欧美伊人久久大香线蕉综合69| 欧美综合国产| 狂野欧美激情性xxxx欧美| 欧美高清视频免费观看| 亚洲国产精品一区在线观看不卡| 最新国产拍偷乱拍精品| 亚洲精品在线免费| 亚洲欧美在线免费观看| 久久狠狠婷婷| 欧美福利视频| 国产精品久在线观看| 国产欧美日韩精品在线| 在线欧美不卡| 一区二区激情| 欧美亚洲综合久久| 麻豆精品视频在线观看| 亚洲精品国产品国语在线app| 亚洲图片欧洲图片av| 久久精品国产亚洲aⅴ| 麻豆成人综合网| 欧美网站大全在线观看| 国内精品国语自产拍在线观看| 亚洲黄色性网站| 亚洲欧美日韩人成在线播放| 久久在线精品| 99pao成人国产永久免费视频| 欧美一级一区| 欧美日韩三级视频| 一区久久精品| 午夜电影亚洲| 亚洲国产精品va在线看黑人动漫| 亚洲一级在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美手机在线| 亚洲经典三级| 久久久久久久综合狠狠综合| 亚洲欧洲精品一区二区三区不卡| 欧美尤物一区| 国产精品久久久久久久久婷婷 | 亚洲高清在线| 亚洲午夜电影在线观看| 麻豆国产精品777777在线| 一本高清dvd不卡在线观看| 久久午夜电影| 国外精品视频|