1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      讀書筆記effectivec++Item13用對(duì)象來管理資源-創(chuàng)新互聯(lián)

      正文

      創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比昭陽網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式昭陽網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋昭陽地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

      回到頂部

      1.不要手動(dòng)釋放從函數(shù)返回的堆資源

      假設(shè)你正在處理一個(gè)模擬Investment的程序庫,不同的Investmetn類型從Investment基類繼承而來,

      1 class Investment { ... }; // root class of hierarchy of2 3 // investment types

      進(jìn)一步假設(shè)這個(gè)程序庫通過一個(gè)工廠函數(shù)(Item 7)來給我們提供特定Investment對(duì)象:

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

      1 Investment* createInvestment(); // return ptr to dynamically allocated2 3 // object in the Investment hierarchy;4 5 // the caller must delete it6 7 // (parameters omitted for simplicity)

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

      正如注釋所表述的,當(dāng)createInvesment返回的對(duì)象不再被使用時(shí),調(diào)用者有責(zé)任將此對(duì)象釋放掉。我們用函數(shù)f來履行這個(gè)職責(zé):

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

       1 void f() 2  3 { 4  5 Investment *pInv = createInvestment(); // call factory function 6  7 ... // use pInv 8  9 delete pInv; // release object10 11 }

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

      這個(gè)方法看上去挺好,但是在一些情況下釋放從createInvestment得來的對(duì)象有可能會(huì)失敗。在函數(shù)的”…”部分中有可能會(huì)出現(xiàn)過早的reture語句,如果這個(gè)return被執(zhí)行了,那么最后的delete語句永遠(yuǎn)不會(huì)被執(zhí)行到;如果createInvesment和delete在一個(gè)循環(huán)中,break和goto語句會(huì)使循環(huán)過早退出,delete也不會(huì)被執(zhí)行到;最后在…中的一些語句有可能會(huì)拋出異常,如果這樣的話,控制流程會(huì)再次不能執(zhí)行到delete。不管delete是怎么被跳過去的,不僅會(huì)泄露Invesment對(duì)象所使用的內(nèi)存,也會(huì)泄露Investment對(duì)象所擁有的任何資源。

      當(dāng)然,小心的編程可以防止這類錯(cuò)誤的發(fā)生,但是你應(yīng)該想到隨著時(shí)間的推移代碼有可能發(fā)生變化。在軟件的維護(hù)過程中,一些人可能在沒有完全領(lǐng)會(huì)這個(gè)函數(shù)的資源管理策略的情況下為其添加一個(gè)return或者continue語句。更糟糕的是,f函數(shù)的”…”部分有可能調(diào)用一個(gè)從來沒有拋出異常的函數(shù),但這個(gè)函數(shù)被“改善”后,它拋出異常了。所以依賴f來到達(dá)delete語句通常是不可行的。

      回到頂部

      2.通過對(duì)象來管理需要手動(dòng)釋放的資源

      為了確保從createInvestment返回的資源總是被釋放,我們需要將資源放到一個(gè)對(duì)象中,當(dāng)離開函數(shù)f的時(shí)候,對(duì)象的析構(gòu)函數(shù)會(huì)自動(dòng)釋放對(duì)象擁有的資源。事實(shí)上,我們已經(jīng)說出了這個(gè)條款一半的內(nèi)容:通過將資源放入對(duì)象中,我們可以依賴c++的析構(gòu)函數(shù)自動(dòng)調(diào)用機(jī)制來確保資源被釋放。(另一半一會(huì)就會(huì)講到)

      2.1 使用auto_ptr來管理資源

      許多資源是被動(dòng)態(tài)的分配在堆上的,它們被用在一個(gè)單獨(dú)的塊或者函數(shù)中,當(dāng)控制流離開塊或者函數(shù)時(shí),這些資源應(yīng)該被釋放。標(biāo)準(zhǔn)庫中的auto_ptr正是為這種情況量身定做的。Auto_ptr是一個(gè)指針(智能指針)一樣的對(duì)象,它的析構(gòu)函數(shù)會(huì)自動(dòng)為其指向的對(duì)象調(diào)用delete函數(shù)。下面演示如何使用auto_ptr來防止可能出現(xiàn)的資源泄露:

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

       1 void f() 2  3 { 4  5 std::auto_ptr pInv(createInvestment()); // call factory 6  7 // function 8  9 ... // use pInv as10 11 // before12 13 } // automatically14 15 // delete pInv via16 17 // auto_ptr’s dtor

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

      2.2 用對(duì)象管理資源的兩個(gè)關(guān)鍵點(diǎn)

      這個(gè)簡單的例子指出了使用對(duì)象管理資源的兩個(gè)關(guān)鍵點(diǎn):

      • 獲取資源后應(yīng)該立即將其轉(zhuǎn)交給資源管理對(duì)象。從上面的例子看出,使用createInvestment返回的資源來初始化對(duì)其進(jìn)行管理的auto_ptr指針。事實(shí)上,用對(duì)象來管理資源的想法通常被叫做”資源獲取的時(shí)候就是初始化的時(shí)候”(Resource Acquisition Is Initialization RAII),因?yàn)閷①Y源獲取和資源管理對(duì)象的初始化放在同一個(gè)語句中是非常常見的。有時(shí)用獲取的資源給資源管理對(duì)象賦值而不是初始化,但是不管哪種方法,都是在資源獲取到之后馬上將控制權(quán)轉(zhuǎn)交給資源管理對(duì)象。

      • 資源管理對(duì)象使用它們的析構(gòu)函數(shù)來確保資源被釋放。因?yàn)椴还芸刂屏魇窃趺措x開塊或函數(shù)的,對(duì)象銷毀的時(shí)候析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用(例如當(dāng)一個(gè)對(duì)象超出了作用域),資源因此能夠被正確釋放。釋放資源時(shí)拋出異常會(huì)使問題變的棘手,這個(gè)問題在Item8中討論了,我們不再擔(dān)心這種問題。

      因?yàn)?當(dāng)auto_ptr被銷毀時(shí)會(huì)自動(dòng)delete它所指向的資源,所以有沒有多個(gè)auto_ptr指向通一個(gè)對(duì)象是很重要的。如果有多個(gè),對(duì)象會(huì)被多次delete,這就會(huì)導(dǎo)致出現(xiàn)未定義行為。為了防止這樣的問題出現(xiàn),auto_ptrs有一個(gè)與眾不同的性質(zhì):被拷貝的指針(通過拷貝構(gòu)造函數(shù)或者拷貝賦值運(yùn)算符)會(huì)被置為null,進(jìn)行拷貝的指針將擁有資源的所有權(quán)

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

       1 std::auto_ptr // pInv1 points to the 2  3 pInv1(createInvestment()); // object returned from 4  5 // createInvestment 6  7 std::auto_ptr pInv2(pInv1); // pInv2 now points to the 8  9 // object; pInv1 is now null10 11 pInv1 = pInv2; // now pInv1 points to the12 13 // object, and pInv2 is null

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

      2.3 用shared_ptr來管理資源

      奇特的拷貝行為,加上“不能有超過一個(gè)的auto_ptr指向被auto_ptr管理的資源”,這兩種特性使得auto_ptrs不是管理所有動(dòng)態(tài)分配資源的最好方法。舉個(gè)例子,STL容器需要”正常的”拷貝行為,因此就不能將容器放入auto_ptr中。

      Auto_ptr的一種替代方法是使用“引用計(jì)數(shù)的智能指針”(reference-counting smart pointer RCSP).RCSP是一種能夠跟蹤有多少對(duì)象指向同個(gè)一特定資源的指針,資源只有在沒有指針指向的情況下才能被釋放。因此,RCSP提供的行為同垃圾回收機(jī)制類似。和垃圾回收機(jī)制不同的是,RCSP不會(huì)制止循環(huán)引用(例如,兩個(gè)都不被使用的對(duì)象卻指向彼此,看上去在被使用一樣。)

      TR1的tr1::shared_ptr(看Item54)是是一個(gè)RCSP,所以你可以這么實(shí)現(xiàn)f:

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

       1 void f() 2  3 { 4  5 ... 6  7 std::tr1::shared_ptr 8  9 pInv(createInvestment()); // call factory function10 11 ... // use pInv as before12 13 } // automatically delete14 15 // pInv via shared_ptr’s dtor

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

      這段代碼看上去同使用auto_ptr大致相同,但是拷貝shared_ptrs的行為更加自然:

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

       1 void f() 2  3 { 4  5 ... 6  7 std::tr1::shared_ptr // pInv1 points to the 8  9 pInv1(createInvestment()); // object returned from10 11 // createInvestment12 13 std::tr1::shared_ptr // both pInv1 and pInv2 now14 pInv2(pInv1); // point to the object15 pInv1 = pInv2; // ditto — nothing has16 // changed17 ...18 } // pInv1 and pInv2 are19 // destroyed, and the20 // object they point to is21 // automatically deleted

      讀書筆記 effective c++ Item 13 用對(duì)象來管理資源

      因?yàn)榭截恡r1::shared_ptrs的工作方式是你所想要的,它們可以被用在像STL容器和其他上下文中,在這里auto_ptr的古怪的拷貝方式不再合適。

      2.4 不要將auto_ptr和shared_ptr用于動(dòng)態(tài)分配數(shù)組

      不要被誤導(dǎo)。這個(gè)條款不是用來介紹關(guān)于auto_ptr,tr1::shared_ptr或者其它類型的智能指針。這個(gè)條款講述的是用對(duì)象管理資源的重要性。使用Auto_ptr和tr1::shared_ptr只是舉個(gè)例子。(關(guān)于tr1::shared_ptr的更多內(nèi)容,查看Item14 18和54)

      Auto_ptr和tr1::shared_ptr的析構(gòu)函數(shù)中使用的是delete而不是delete[]。(Item16 描述了區(qū)別)這意味著在auto_ptr或者tr1::shared_ptr中存放動(dòng)態(tài)分配的數(shù)組不是一個(gè)好方法,令人遺憾的是,這種用法可以通過編譯:

      1 std::auto_ptr // bad idea! the wrong2 3 aps(new std::string[10]); // delete form will be used4 5 std::tr1::shared_ptr spi(new int[1024]); // same problem

      你會(huì)驚奇的發(fā)現(xiàn)c++中沒有用于動(dòng)態(tài)分配數(shù)組的類似auto_ptr或者tr1::shared_ptr的東西,TR1中也沒有。因?yàn)関ector和string基本可以替代動(dòng)態(tài)分配數(shù)組了。如果你仍然認(rèn)為存在用于動(dòng)態(tài)分配數(shù)組的類似于auto_ptr和tr1::shared_ptr的類是好的,可以看一下Boost(Item 55).你會(huì)非常高興的發(fā)現(xiàn)boost::scoped_array和boost::shared_array類提供了你正在尋找的。

      回到頂部

      3.其他問題

      這個(gè)條款中,使用對(duì)象管理資源的指導(dǎo)方針意味著如果你自己手動(dòng)釋放資源(例如使用delete而不是一個(gè)資源管理類),你的做法就是錯(cuò)誤的。 預(yù)裝的資源管理類,像auto_ptr和tr1::shared_ptr使遵守這個(gè)條款變的更加容易,但有時(shí)候當(dāng)你使用一個(gè)資源的時(shí)候你會(huì)發(fā)現(xiàn)這些預(yù)制的類沒有做到你想要的。這種情況下,你就需要編寫你自己的資源管理類了。這也不是非常難的,但確實(shí)有一些微妙的地方需要你考慮。這些注意點(diǎn)將要在Item14和Item15種進(jìn)行討論。

      最后,我必須指出createInvestment的原生指針返回類型是資源泄露的×××,因?yàn)檎{(diào)用者很容易就會(huì)忘記調(diào)用delete(即使使用auto_ptr和tr1::shared_ptr來執(zhí)行delete,它們?nèi)匀恍枰浀脤reateInvestment的返回值放入智能指針對(duì)象中)。對(duì)付這個(gè)問題需要調(diào)用createInvestment的修訂版本,這個(gè)問題會(huì)在Item18中進(jìn)行討論。

      另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


      本文標(biāo)題:讀書筆記effectivec++Item13用對(duì)象來管理資源-創(chuàng)新互聯(lián)
      文章起源:http://ef60e0e.cn/article/cocpjg.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        温泉县| 元阳县| 和平县| 呈贡县| 无极县| 抚州市| 河津市| 从化市| 乡城县| 高雄县| 旅游| 高尔夫| 申扎县| 改则县| 太白县| 商城县| 富民县| 汉沽区| 革吉县| 保靖县| 吴旗县| 长武县| 神木县| 谷城县| 怀集县| 任丘市| 麟游县| 河间市| 六安市| 普兰县| 林口县| 偏关县| 拉孜县| 万山特区| 岳西县| 灵寿县| 安阳市| 汾阳市| 洪雅县| 丰台区| 昔阳县|