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

隨筆 - 181  文章 - 15  trackbacks - 0
<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

My Tech blog

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

        這一部分會將要討論一下auto_ptr.c++標準庫提供auto_ptr作為一種智能指針,有了這種智能指針,就可以在異常被拋出的時候避免資源的泄漏.注意,auto_ptr只是智能指針的一種.因為事實上有多種智能指針存在.而auto_ptr只是被用來滿足某種情形下的需求的.而對于其他一些情形,auto_ptr無能為力.所以在使用的時候 要格外注意.
        auto_ptr的動機
        通常,一個函數會按照下面的流程進行操作:
        1.獲取資源.
        2.進行一些操作.
        3.釋放之前所獲取的資源.
        如果函數所獲取的那些資源與本地對象綁定,它們就會在函數結束的時候被自動釋放掉.因為本地對象的析構函數會被調用.但是如果資源被顯式獲取,并且沒有與任何對象綁定,它們必須也被顯式的釋放掉.在使用指針的時候,資源通常是被顯式管理的.
        一種典型的像上面這樣使用資源的方式就是使用new來創建和用delete來釋放.
        但是作釋放用的delete操作往往被忽略(特別是函數有返回值的時候).當然,出現異常的時候,也同樣會發生這種風險.因為異常有可能馬上停止你函數的執行,而不去進行delete釋放.結果就是內存泄漏,或者說得寬泛一些,是"資源泄漏".為了避免資源泄漏,通常需要函數能夠捕獲所有的異常.隨之而來的就是,代碼變得越來越復雜,冗長.
        伴隨著這種情況的發生,一種智能指針auto_ptr出現了.在任何時候,一旦指針本身被銷毀,它所指向的數據也會被銷毀.此外,因為智能指針是一個本地變量,不管函數到底是因為正常結束,還是因為非正常結束,auto_ptr所指向的數據都會被銷毀.
        有了auto_ptr,delete語句和catch語句就變得不那么必要了.auto_ptr和普通指針的使用方式基本相同,即用樣用"*"表示它所指向的對象,同樣用"->"來訪問所指向對象的成員方法.但是有關指針的運算(比如指針的自加)不被支持(這也許是一個優點,因為指針運算也許會造成一些麻煩).
        注意auto_ptr<>不允許你使用指派的方式來聲明它所指向的對象,比如:
        下面的操作是不允許的:
        std::auto_ptr<ClassA> ptr2 = new ClassA; //ERROR
        而應該采用顯式的構造函數來初始化:
        std::auto_ptr<ClassA> ptr1(new ClassA);  //OK
        通過auto_ptr來轉換所有權
        auto_ptr在語意上提供了對于所有全的嚴格約束.這意味著因為如果一個auto_ptr刪除了它所指向的對象,那么這個對象將不會被其他任何對象所擁有.兩個或以上的auto_ptr絕不能同時擁有一個對象.不幸的是,這種情況是有可能出現的.所以只能有程序員來確保這種情況不會發生.
        那么在這種情況下,auto_ptr的拷貝構造函數如何工作呢?通常它會把一個對象的數據復制給另外一個對象,但是在這里,恰恰是這種行為會導致兩個auto_ptr擁有相同對象這種情況的出現.解決方法很簡單,但是卻得出了一個重要結論:auto_ptr的拷貝構造函數和指派操作促成了auto_ptr對于對象所有權的一次移交.
        看一下下面的代碼:
        //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所創建的那個對象.然后第二句把對于對象的所有權從ptr1轉移給了ptr2.所以在第二句之后,ptr2擁有new創建的那個對象的所有權,而ptr1則自動失去了對于那個對象的所有權.ClassA只會在ptr2被析構的時候被釋放掉.
        同樣,對于一次指派操作也是如此.如下所示:
        //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
        注意,隨著所有權的移交,之前失去對象所有權的那個auto_ptr就變成了一個空指針.
        當然,還可以讓這個失去所指的空指針重新指向一個對象,像下面這樣:
        std::auto_ptr<ClassA> ptr;               //create an auto_ptr
        ptr = std::auto_ptr<ClassA>(new ClassA); //OK, delete old object and own new
        對于所指向的對象的所有權的變換為我們提供了auto_ptr的一種潛在用法.函數可以使用向其他的函數傳遞所有權.這包含兩種情況.
        1.傳入函數的對象不再使用.即在auto_ptr作為參數傳遞的時候.在這種情況下,被調用的函數得到了傳入的auto_ptr所指向的那個對象的所有權.因此,如果函數不再將對象的所有權轉移出來,那么對象就會在函數的調用結束之后銷毀.
         2.函數要向外傳出對象.當auto_ptr被返回的時候,所有權由被調用的函數轉移給調用方.
         由于auto_ptr總是牽扯到對象所有權變換的問題,所以在使用的時候一定要注意你是否真的要轉換這個所有權.
         你可能打算通過引用傳遞auto_ptr(s).但是這樣做有可能最終你都不清楚所有權的歸屬了.總之,這不是一個好的決定或設計.
        從auto_ptr的概念出發,你可能會覺得即使是傳遞常指針的話,對象的歸屬也會改變.如果這種情況可能發生,那將是非常危險的.因為人們總是不期待一個成為"常量"的東西發生改變.幸運的是,通過一些技術上的處理,這樣做是不可能的.如:
       
 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,這就表明,這個auto_ptr不能將自己所指對象的所有權傳遞給其他對象.因而調用函數getValue的時候如果傳遞了上面定義的auto_ptr,就會被編譯器發現,并作為編譯錯誤反饋回來:
錯誤: 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)作為成員變量
當然,如果在類中使用auto_ptr的時候,你同樣也可以避免資源泄漏這種問題的發生.如果你使用auto_ptr取代通常的指針的話,你將不再需要對那些對象進行手動的析構處理.同時,auto_ptr也能夠有效避免因為初始化異常而導致資源泄漏這種情況的發生.因為析構總是在構造之后,所以如果在構造的時候發生異常,你往往不能夠及時釋放資源,進而導致資源泄漏情況的發生.
        但是,在享用了auto_ptr帶來的諸多好處的同時,你在處理拷貝構造函數和重載賦值操作的時候,要格外注意auto_ptr所有權變換的問題.當然,避免這類問題的最好方法就是使用常量指針.
        有關auto_ptr(s)的濫用
        auto_ptr能夠滿足一些需要,特別是容易發生資源泄漏的時候,它總能夠發揮好的效果.但是在使用它的時候仍然需要注意,不要濫用.在使用的時候,要注意以下幾點:
        1.auto_ptr(s)不能夠共享對于所指向對象的所有權.
        2auto_ptr(s)不提供對于數組的支持.因為在釋放資源的時候,auto_ptr使用的是delete而不是delete[].當然,對于數組而言,STL也有相應的處理辦法,比如容器.
        3.auto_ptr(s)不是智能指針的全部.注意它并不能解決一切問題.注意它的應用場景.
        4.auto_ptr(s)不能滿足容器中對象的操作要求.

       







       

posted on 2007-07-12 22:46 littlegai 閱讀(359) 評論(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>
            亚洲黄色免费网站| 亚洲精品中文字幕在线| 午夜视频久久久久久| 99视频超级精品| 国产精品99久久久久久久vr| 中日韩美女免费视频网站在线观看| 亚洲激情一区二区| 最新成人在线| 亚洲一区欧美一区| 久久精品国产清自在天天线| 老司机一区二区三区| 欧美日本乱大交xxxxx| 欧美三级免费| 亚洲在线免费视频| 欧美精品久久天天躁| 欧美日韩免费观看一区| 国产精品女主播在线观看 | 亚洲女同精品视频| 欧美一级午夜免费电影| 免费观看在线综合| 日韩午夜激情av| 久久精品一区| 国产精品成人一区二区三区吃奶| 国内精品久久久久久久97牛牛| 日韩午夜激情av| 欧美在线黄色| 日韩天堂av| 久久一区中文字幕| 国产精品一区二区三区观看| 亚洲日韩中文字幕在线播放| 午夜精品久久久久久久久久久久久| 免费日韩成人| 亚洲欧美三级伦理| 欧美福利电影在线观看| 国产亚洲电影| 亚洲已满18点击进入久久| 蜜臀av性久久久久蜜臀aⅴ四虎| 夜夜嗨av一区二区三区中文字幕 | 国产精品久久久久久久久借妻| 影音先锋亚洲视频| 欧美一区影院| 国产精品99久久久久久久久 | 伊人男人综合视频网| 亚洲你懂的在线视频| 亚洲日本无吗高清不卡| 两个人的视频www国产精品| 国产色爱av资源综合区| 亚洲资源在线观看| 夜夜精品视频| 欧美四级在线| 亚洲新中文字幕| 日韩午夜一区| 欧美片在线观看| 日韩网站免费观看| 亚洲激情第一页| 欧美顶级大胆免费视频| 亚洲精品国产精品国产自| 欧美a级理论片| 久久亚洲综合色| 亚洲国产精品欧美一二99| 免费观看成人www动漫视频| 久久精品一区二区三区中文字幕| 国产一区二区三区在线观看视频| 久久精品国亚洲| 久久精品三级| 亚洲国产日韩一区二区| 亚洲高清久久网| 欧美大胆a视频| 久久精品国产99国产精品澳门 | 男人的天堂亚洲| 久久久精品一品道一区| 在线观看91精品国产麻豆| 麻豆精品视频| 欧美成人一区二区在线| 亚洲精品久久久久久久久久久久 | 在线亚洲一区观看| 一区二区日韩免费看| 国产精品手机视频| 久久婷婷丁香| 欧美成人免费一级人片100| 99国产精品久久久久久久久久| 一个色综合导航| 国产香蕉久久精品综合网| 可以免费看不卡的av网站| 欧美1区2区视频| 亚洲一区二区三区国产| 午夜影院日韩| 亚洲国产婷婷香蕉久久久久久99 | 亚洲另类春色国产| 国产精品影视天天线| 巨乳诱惑日韩免费av| 欧美国产亚洲精品久久久8v| 亚洲欧美日韩另类精品一区二区三区| 午夜国产精品视频免费体验区| 激情懂色av一区av二区av| 亚洲日韩第九十九页| 国产欧美日韩视频在线观看| 免费观看在线综合| 国产精品免费福利| 亚洲成在人线av| 国产亚洲成精品久久| 日韩网站免费观看| 亚洲国产高清在线| 亚洲一区二区三区中文字幕在线| 欲香欲色天天天综合和网| 亚洲午夜成aⅴ人片| 亚洲日韩成人| 欧美在线日韩精品| 亚洲在线1234| 欧美黄色精品| 欧美11—12娇小xxxx| 国产视频一区三区| 一区二区三区国产盗摄| 亚洲日本va午夜在线影院| 欧美一区二区成人| 午夜亚洲伦理| 欧美日韩中文字幕在线| 亚洲激情视频网站| 亚洲国产福利在线| 久久视频一区二区| 久久精品五月婷婷| 日韩一区二区免费看| 久久久噜噜噜久噜久久| 欧美一区二区三区四区在线观看地址| 欧美激情国产日韩| 欧美99在线视频观看| 国内一区二区在线视频观看 | 久久人人97超碰精品888| 欧美丝袜一区二区| 亚洲精品人人| 一本色道久久加勒比精品| 免费在线观看一区二区| 美女尤物久久精品| 精品999日本| 久久久美女艺术照精彩视频福利播放| 久久久精彩视频| 黄色影院成人| 久久久噜噜噜久久中文字幕色伊伊| 久久九九热re6这里有精品 | 亚洲视频在线观看免费| 欧美精品日韩www.p站| 91久久精品美女高潮| 亚洲精品视频在线播放| 欧美剧在线观看| 99视频精品免费观看| 亚洲伊人伊色伊影伊综合网| 国产精品欧美久久| 午夜一区二区三区在线观看| 久久精品成人| 在线精品视频一区二区三四| 蜜臀a∨国产成人精品| 亚洲精品乱码久久久久久黑人| 一本色道久久综合亚洲精品不卡 | 久久久不卡网国产精品一区| 狠狠色伊人亚洲综合网站色| 久久精品国产亚洲一区二区| 欧美成人一区二区三区片免费| 亚洲国产高潮在线观看| 欧美日韩三级视频| 亚洲午夜一级| 久久久噜噜噜久久久| 亚洲第一天堂无码专区| 欧美日韩国产综合网 | 欧美v国产在线一区二区三区| 亚洲国产一二三| 欧美日韩在线观看一区二区三区| 亚洲欧美www| 欧美国产成人在线| 亚洲自拍偷拍色片视频| 韩国精品一区二区三区| 欧美护士18xxxxhd| 午夜免费在线观看精品视频| 欧美激情在线播放| 欧美有码在线观看视频| 亚洲精品视频免费| 国产视频精品xxxx| 欧美日韩国产首页| 久久永久免费| 亚洲在线网站| 亚洲人成在线观看一区二区 | 久久久久久夜| 欧美fxxxxxx另类| 久久久国产精彩视频美女艺术照福利| 国产一区二区日韩| 欧美日韩国产免费| 久久久久9999亚洲精品| 一本色道久久| 欧美大片免费观看| 久久国产精品久久w女人spa| 99v久久综合狠狠综合久久| 国产一区二区按摩在线观看| 欧美日韩伦理在线免费| 久久夜色撩人精品| 亚洲视频在线观看一区| 亚洲激情成人| 欧美freesex8一10精品| 久久久水蜜桃av免费网站| 亚洲欧美日韩一区二区三区在线观看| 91久久综合| 亚洲电影在线看|