第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候使用哪種指針?

什么時候使用哪種指針?

C++ C
白衣染霜花 2019-06-20 10:54:46
什么時候使用哪種指針?好吧,我最后一次寫C+是為了謀生,std::auto_ptr所有的STD庫都可用,boost::shared_ptr都很瘋狂。我從來沒有真正研究過其他智能指針類型提供的Boost。據我所知,C+11現(xiàn)在提供了一些類型Boost,但不是所有這些類型。那么,是否有人有一個簡單的算法來確定何時使用哪個智能指針?最好包括關于啞指針的建議(原始指針如T*)和其他的Boost智能指針。(有點像這,這個會很棒的)。
查看完整描述

3 回答

?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

共有所有權:
這個shared_ptrweak_ptr所采用的標準與其Boost對口..當您需要共享資源時使用它們,而不知道哪個資源將是最后一個活著的資源。使用weak_ptr觀察共享資源而不影響其生存期,而不是中斷周期。循環(huán)shared_ptr正常情況下不應該發(fā)生-兩種資源不能互相擁有。

請注意,Boost還提供了額外的服務shared_array,這可能是一個合適的替代方案。shared_ptr<std::vector<T> const>.

接下來,增加報價intrusive_ptr,這是一個輕量級的解決方案,如果您的資源已經提供了參考計數管理,并且您希望將它應用到Raii原則中。這個沒有被標準采納。

獨特所有權:
Boost還有一個scoped_ptr,它是不可復制的,并且不能為其指定刪除項。std::unique_ptrboost::scoped_ptr服用類固醇,應該是你的需要智能指針時的默認選擇..它允許您在其模板參數中指定刪除項,并且可動,不像boost::scoped_ptr..它在STL容器中也是完全可用的,只要您不使用需要可復制類型的操作(顯然)。

請再次注意,該Boost有一個數組版本:scoped_array,該標準通過要求std::unique_ptr<T[]>部分專業(yè)化delete[]指針而不是delete(用default_deleter)。std::unique_ptr<T[]>也提供operator[]而不是operator*operator->.

請注意std::auto_ptr仍然是標準的,但它是棄用§D.10 [depr.auto.ptr]

類模板auto_ptr不受歡迎。[注:類模板unique_ptr(20.7.1)提供了一個更好的解決方案。-尾注 ]

無所有權:
使用啞指針(原始指針)或引用不擁有引用當您知道資源將超過引用對象/作用域。當您需要空值或可重置時,更喜歡引用并使用原始指針。

如果您想要對資源的非所有者引用,但不知道資源是否會超過引用它的對象,請將資源打包到shared_ptr并使用weak_ptr-你可以測試父母是否shared_ptr活在lock,它將返回shared_ptr如果資源仍然存在,則為非空。如果要測試資源是否已死,請使用expired..這兩者聽起來可能很相似,但在并行執(zhí)行的情況下卻有很大的不同,如expired僅保證該語句的返回值??此茻o辜的考驗

if(!wptr.expired())
  something_assuming_the_resource_is_still_alive();

是一種潛在的種族狀況。


查看完整回答
反對 回復 2019-06-20
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

決定使用哪個智能指針是一個問題所有權..當涉及到資源管理時,對象A擁有對象B如果它控制著對象B的生存期。例如,成員變量由它們各自的對象擁有,因為成員變量的生存期與對象的生存期相關聯(lián)。根據對象的擁有方式選擇智能指針。

請注意,軟件系統(tǒng)中的所有權與所有權是分開的,就像我們在軟件之外所認為的那樣。例如,一個人可能“擁有”他們的家,但這并不一定意味著Person對象的生存期具有控制權。House對象。將這些真實世界的概念和軟件概念混為一談是一種讓自己陷入困境的可靠方法。


如果您擁有該對象的唯一所有權,請使用std::unique_ptr<T>.

如果您共享了對象的所有權.
-如果沒有所有權周期,則使用std::shared_ptr<T>.
-如果有周期,定義一個“方向”并使用std::shared_ptr<T>在一個方向std::weak_ptr<T>在另一個。

如果對象擁有您,但可能沒有所有者,則使用普通指針。T*(例如父指針)。

如果對象擁有您(或以其他方式保證存在),請使用引用。T&.


警告:要注意智能指針的成本。在內存或性能有限的環(huán)境中,只使用普通指針和更手動的內存管理方案可能是有益的。

費用:

  • 如果您有一個自定義刪除器(例如,您使用分配池),那么這將導致每個指針的開銷,這很容易通過手動刪除來避免。
  • std::shared_ptr

    具有復制上的引用計數增量的開銷,加上銷毀時的減少,然后進行0計數檢查并刪除所保存的對象。根據實現(xiàn)的不同,這會使您的代碼膨脹并導致性能問題。
  • 編譯時間。與所有模板一樣,智能指針對編譯時間有負面貢獻。

例子:

struct BinaryTree{
    Tree* m_parent;
    std::unique_ptr<BinaryTree> m_children[2]; // or use std::array...};

二叉樹并不擁有它的父樹,但是樹的存在意味著它的父樹(或nullptr),因此使用普通指針。二叉樹(具有值語義)擁有其子樹的唯一所有權,因此std::unique_ptr.

struct ListNode{
    std::shared_ptr<ListNode> m_next;
    std::weak_ptr<ListNode> m_prev;};

在這里,列表節(jié)點擁有它的下一個列表和前一個列表,因此我們定義了一個方向,并使用shared_ptr接下來weak_ptr讓普雷夫打破這個循環(huán)。


查看完整回答
反對 回復 2019-06-20
  • 3 回答
  • 0 關注
  • 516 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號