国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Effective C++條款17——以獨(dú)立語句將newed 對象置入智能指針(資源管理)

這篇具有很好參考價(jià)值的文章主要介紹了Effective C++條款17——以獨(dú)立語句將newed 對象置入智能指針(資源管理)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

假設(shè)我們有個(gè)函數(shù)用來揭示處理程序的優(yōu)先權(quán),另一個(gè)函數(shù)用來在某動(dòng)態(tài)分配所得的widget上進(jìn)行某些帶有優(yōu)先權(quán)的處理:

void priority();
void processWidget(std::tr1::shared_ptr<Widget>pw, int priority);

由于謹(jǐn)記“以對象管理資源”(條款13)的智慧銘言,processwidget決定對其動(dòng)態(tài)分配得來的widget運(yùn)用智能指針(這里采用trl::shared_ptr)。

現(xiàn)在考慮調(diào)用processwidget:

processWidget(new Widget, priority());

等等,不要考慮這個(gè)調(diào)用形式。它不能通過編譯。tr1::shared ptr構(gòu)造函數(shù)需要一個(gè)原始指針(raw pointer),但該構(gòu)造函數(shù)是個(gè)explicit構(gòu)造函數(shù),無法進(jìn)行隱式轉(zhuǎn)換,將得自"newWidget"的原始指針轉(zhuǎn)換為processwidget所要求的tr1::shared ptr。如果寫成這樣就可以通過編譯:

processWidget(std::tr1::shared_ptr<Widget>pw, int priority);

令人驚訝的是,雖然我們在此使用“對象管理式資源”( object-managingresources) ,上述調(diào)用卻可能泄漏資源。稍后我再詳加解釋。

編譯器產(chǎn)出一個(gè)processWidget調(diào)用碼之前,必須首先核算即將被傳遞的各個(gè)實(shí)參。上述第二實(shí)參只是一個(gè)單純的對 priority函數(shù)的調(diào)用,但第一實(shí)參由兩部分組成:std::trl::shared ptr<Widget> (new widget)

  • 執(zhí)行"new widget”表達(dá)式
  • 調(diào)用tr1::shared ptr構(gòu)造函數(shù)

于是在調(diào)用processwidget之前,編譯器必須創(chuàng)建代碼,做以下三件事:

  • 調(diào)用priority
  • 執(zhí)行"new widget"
  • 調(diào)用tr1::shared ptr構(gòu)造函數(shù)

C++編譯器以什么樣的次序完成這些事情呢?彈性很大。這和其他語言如Java和C#不同,那兩種語言總是以特定次序完成函數(shù)參數(shù)的核算。可以確定的是“newwidget”一定執(zhí)行于tr1::shared ptr構(gòu)造函數(shù)被調(diào)用之前,因?yàn)檫@個(gè)表達(dá)式的結(jié)果還要被傳遞作為tr1::shared_ptr構(gòu)造函數(shù)的一個(gè)實(shí)參,但對priority的調(diào)用則可以排在第---或第二或第三執(zhí)行。如果編譯器選擇以第二順位執(zhí)行它(說不定可因此生成更高效的代碼,誰知道!),最終獲得這樣的操作序列:

  1. 執(zhí)行"new widget"
  2. 調(diào)用priority
  3. 調(diào)用tr1: :shared ptr構(gòu)造函數(shù)

現(xiàn)在請你想想,萬一對priority的調(diào)用導(dǎo)致異常,會(huì)發(fā)生什么事?在此情況下"new widget”返問的指針將會(huì)遺失,因?yàn)樗形幢恢萌雝r1 : :shared ptr內(nèi),后者是我們期盼用來防衛(wèi)資源泄漏的武器。是的,在對processwidget的調(diào)用過程中可能引發(fā)資源泄漏,因?yàn)樵凇百Y源被創(chuàng)建(經(jīng)由"new widget")”和“資源被轉(zhuǎn)換為資源管理對象”兩個(gè)時(shí)間點(diǎn)之間有可能發(fā)生異常干擾。

避免這類問題的辦法很簡單:使用分離語句,分別寫出(1)創(chuàng)建widge,(2)將它置入一個(gè)智能指針內(nèi),然后再把那個(gè)智能指針傳給processwidget:

std::tr1::shared_ptr<Widget> pw(new Widget);

processWidget(pw, priority());

以上之所以行得通,因?yàn)榫幾g器對于“跨越語句的各項(xiàng)操作”沒有重新排列的自由(只有在語句內(nèi)它才擁有那個(gè)自由度)。在上述修訂后的代碼內(nèi),"new Widget"表達(dá)式以及“對tr1:: shared_ptr構(gòu)造函數(shù)的調(diào)用”這兩個(gè)動(dòng)作,和“對priority的調(diào)用”是分隔開來的,位于不同語句內(nèi),所以編譯器不得在它們之間任意選擇執(zhí)行次序。

請記住文章來源地址http://www.zghlxwxcb.cn/news/detail-672951.html

  • 以獨(dú)立語句將newed對象存儲(chǔ)于(置入)智能指針內(nèi)。如果不這樣做,一旦異常被拋出,有可能導(dǎo)致難以察覺的資源泄漏。

到了這里,關(guān)于Effective C++條款17——以獨(dú)立語句將newed 對象置入智能指針(資源管理)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Effective C++條款07——為多態(tài)基類聲明virtual析構(gòu)函數(shù)(構(gòu)造/析構(gòu)/賦值運(yùn)算)

    有許多種做法可以記錄時(shí)間,因此,設(shè)計(jì)一個(gè)TimeKeeper base class和一些derived classes 作為不同的計(jì)時(shí)方法,相當(dāng)合情合理: 許多客戶只想在程序中使用時(shí)間,不想操心時(shí)間如何計(jì)算等細(xì)節(jié),這時(shí)候我們可以設(shè)計(jì)factory (工廠)函數(shù),返回指針指向一個(gè)計(jì)時(shí)對象。Factory函數(shù)會(huì)“返回

    2024年02月12日
    瀏覽(27)
  • Effective C++ 學(xué)習(xí)筆記 條款23 寧以non-member、non-friend替換member函數(shù)

    想象有個(gè)class用來表示網(wǎng)頁瀏覽器。這樣的class可能提供的眾多函數(shù)中,有一些用來清除下載元素高速緩存區(qū)(cache of downloaded elements)、清除訪問過的URLs的歷史記錄(history of visited URLs)、以及移除系統(tǒng)中的所有cookies: 許多用戶會(huì)想一整個(gè)執(zhí)行所有這些動(dòng)作,因此WebBrowser也

    2024年03月15日
    瀏覽(14)
  • 【C++基礎(chǔ)(九)】C++內(nèi)存管理--new一個(gè)對象出來

    【C++基礎(chǔ)(九)】C++內(nèi)存管理--new一個(gè)對象出來

    ??博主CSDN主頁:杭電碼農(nóng)-NEO?? ? ?專欄分類:C++從入門到精通? ? ??代碼倉庫:NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)習(xí)C++ ? ???? 在C語言中,有四個(gè)內(nèi)存管理函數(shù): malloc,calloc,realloc和free 但是它們的使用十分的不方便: 代碼量很大,并且有一個(gè)新的問題: malloc函數(shù)不會(huì)初始

    2024年02月14日
    瀏覽(23)
  • 【C++】還new不出對象?看看C++怎么做~(C++內(nèi)存管理)

    【C++】還new不出對象?看看C++怎么做~(C++內(nèi)存管理)

    ??????? 個(gè)人主頁:簡 料 ???? 所屬專欄:C++ ???? 個(gè)人社區(qū):越努力越幸運(yùn)社區(qū) ???? 簡? ? ?? 介: 簡料簡料,簡單有料~在校大學(xué)生一枚,專注C/C++/GO的干貨分享,立志成為您的好幫手 ~ C/C++學(xué)習(xí)路線 (點(diǎn)擊解鎖) ?? C語言 ?? 初階數(shù)據(jù)結(jié)構(gòu)與算法 ?? C++ ??

    2024年02月05日
    瀏覽(13)
  • [C++] 一篇帶你了解C++中動(dòng)態(tài)內(nèi)存管理,new讓大家都有對象

    [C++] 一篇帶你了解C++中動(dòng)態(tài)內(nèi)存管理,new讓大家都有對象

    ? 目錄 1、C/C++內(nèi)存分布 2.、C語言中動(dòng)態(tài)內(nèi)存管理方式:malloc、calloc、realloc 3、C++內(nèi)存管理方式 3.1 new/delete操作內(nèi)置類型 3.2 new和delete操作自定義類型 3.3 malloc與new的異常處理機(jī)制 4、operator new與operator delete函數(shù) 4.1 operator new與operator delete函數(shù) 4.1.1 operator new源碼 4.1.2 operator del

    2024年02月13日
    瀏覽(23)
  • 【C++深入淺出】C/C++內(nèi)存管理(教你如何new到對象)

    【C++深入淺出】C/C++內(nèi)存管理(教你如何new到對象)

    ? ? ? ? 前面我們學(xué)習(xí)了有關(guān)C++類和對象的知識(shí),學(xué)會(huì)了如何構(gòu)建一個(gè)完整的類,這些類都是存儲(chǔ)在 ??臻g 上的。在C語言中,我們不僅可以在棧上定義變量,也可以對 堆 上的空間進(jìn)行管理,在接下來的幾期中,我們的目標(biāo)就是 學(xué)會(huì)C++中是如何進(jìn)行內(nèi)存管理的 。 ? ? ? ?

    2024年02月08日
    瀏覽(31)
  • 侯捷 C++ part2 兼談對象模型筆記——7 reference、const、new/delete

    7.1 reference x 是整數(shù),占4字節(jié); p 是指針占4字節(jié)(32位); r 代表 x ,那么 r 也是整數(shù) ,占4字節(jié) 引用與指針不同,只能代表一個(gè)變量,不能改變 引用底部的實(shí)現(xiàn)也是指針,但是注意 object 和它的 reference 的 大小是相同的,地址也是相同的 (是編譯器制造的假象) reference 通

    2024年02月12日
    瀏覽(44)
  • Effective Java筆記(6)避免創(chuàng)建不必要的對象

    Effective Java筆記(6)避免創(chuàng)建不必要的對象

    ????????一般來說,最好能重用單個(gè)對象,而不是在每次需要 的時(shí)候就創(chuàng)建一個(gè)相同功能的新對象 。 重用方式既快速,又流行 。 如果對象是不可變的( immutable ) (詳見第 17 條),它就始終可以被重用 。 ????????作為一個(gè)極端的反面例子,看看下面的語句 : ???

    2024年02月15日
    瀏覽(26)
  • 【Effective C++】讓自己習(xí)慣C++

    C++由四個(gè)次語言組成: C:過程形式,沒有模板、沒有異常、沒有重載 Object-Oriented C++:面向?qū)ο笮问?,類(?gòu)造函數(shù)和析構(gòu)函數(shù))、封裝、繼承、多態(tài) Template:泛型編程、模板元編程 STL:容器、算法、迭代器和函數(shù)對象 目標(biāo)是讓編譯器來替代預(yù)處理器,使用預(yù)處理器會(huì)存在

    2024年01月21日
    瀏覽(47)
  • LLMs:《Efficient and Effective Text Encoding for Chinese LLaMA and Alpaca-4月17日版》翻譯與解讀

    LLMs:《Efficient and Effective Text Encoding for Chinese LLaMA and Alpaca-4月17日版/舊版》翻譯與解讀 目錄 相關(guān)文章 論文相關(guān) LLMs:《Efficient and Effective Text Encoding for Chinese LLaMA and Alpaca-4月17日版》翻譯與解讀 LLMs:《Efficient And Effective Text Encoding For Chinese Llama And Alpaca—6月15日版本》翻譯與

    2024年02月13日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包