條款 17:以獨立語句將 newed 對象置入智能指針

Effective C++ 中文版 第三版》讀書筆記

** 條款 17:以獨立語句將 newed 對象置入智能指針 **

proToby(std::tr1::shared_ptr<Widget>(new Widget), priority());

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

  1. 調(diào)用 priority
  2. 執(zhí)行 “new Widget”
  3. 調(diào)用 tr1::shared_ptr 構造函數(shù)

C++ 編譯器會以什么樣的順序完成這些事情呢?彈性很大。這和其他語言如 Java 和 C# 是不同的,后兩者總是以特定的次序完成函數(shù)參數(shù)的構造??梢源_定的是 “new Widget” 一定執(zhí)行于 tr1::shared_ptr 構造函數(shù)被調(diào)用之前,因為這個表達式的結果還要被傳遞作為 tr1::shared_ptr 構造函數(shù)的一個實參,但是對調(diào)用 priority 則可以排在第一、第二或者第三位執(zhí)行。若編譯器,恰巧把調(diào)用 priority 排在了第二位。最終獲得這樣的操作序列:

  1. 執(zhí)行 “new Widget”
  2. 調(diào)用 priority
  3. 調(diào)用 tr1::shared_ptr 構造函數(shù)

現(xiàn)在想一個問題:萬一對 priority 的調(diào)用導致異常,會發(fā)生什么事?此時,“new Widget” 返回的指針將會遺失,因為他未被置入 tr1::shared_ptr 內(nèi),后者是我們用來期盼用來方位資源泄漏的武器。但是從這個可能的情況中,我們發(fā)現(xiàn):在對 proToby 的調(diào)用過程中可能引發(fā)資源泄漏,因為在“資源被創(chuàng)建(經(jīng)由 “new Widget”)”和“資源被轉(zhuǎn)換為資源管理對象”兩個時間點之間有可能發(fā)生異常干擾。

避免的辦法:使用分離語句,分別寫出(1)創(chuàng)建 Widget,(2)將它置入一個智能指針內(nèi),然后再把那個智能指針傳給 proToby:

std::tr1::shared_ptr<Widget> pT(new Widget);
proToby(pT,priority());

這樣之所以可行,因為編譯器對于“跨越語句的各項操作”沒有重新排列的自由(只有在語句內(nèi)他才有這個自由)。

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 再讀高效c++,頗有收獲,現(xiàn)將高效c++中的經(jīng)典分享如下,希望對你有所幫助。 1、盡量以const \enum\i...
    橙小汁閱讀 1,312評論 0 1
  • 1. 讓自己習慣C++ 條款01:視C++為一個語言聯(lián)邦 為了更好的理解C++,我們將C++分解為四個主要次語言:...
    Mr希靈閱讀 2,994評論 0 13
  • 3 資源管理 所謂資源就是,一旦用了它,將來必須還給系統(tǒng)。C++程序中最常使用的資源就是動態(tài)分配內(nèi)存(如果分配內(nèi)存...
    暗夜望月閱讀 461評論 0 0
  • 原作者:Babu_Abdulsalam 本文翻譯自CodeProject,轉(zhuǎn)載請注明出處。 引入### Ooops...
    卡巴拉的樹閱讀 30,362評論 13 74
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,676評論 1 51

友情鏈接更多精彩內(nèi)容