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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

什么時(shí)候使用哪種指針?

什么時(shí)候使用哪種指針?

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

3 回答

?
哈士奇WWW

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊

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

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

接下來,增加報(bào)價(jià)intrusive_ptr,這是一個(gè)輕量級(jí)的解決方案,如果您的資源已經(jīng)提供了參考計(jì)數(shù)管理,并且您希望將它應(yīng)用到Raii原則中。這個(gè)沒有被標(biāo)準(zhǔn)采納。

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

請(qǐng)?jiān)俅巫⒁猓揃oost有一個(gè)數(shù)組版本:scoped_array,該標(biāo)準(zhǔn)通過要求std::unique_ptr<T[]>部分專業(yè)化delete[]指針而不是delete(用default_deleter)。std::unique_ptr<T[]>也提供operator[]而不是operator*operator->.

請(qǐng)注意std::auto_ptr仍然是標(biāo)準(zhǔn)的,但它是棄用§D.10 [depr.auto.ptr]

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

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

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

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

是一種潛在的種族狀況。


查看完整回答
反對(duì) 回復(fù) 2019-06-20
?
吃雞游戲

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

決定使用哪個(gè)智能指針是一個(gè)問題所有權(quán)..當(dāng)涉及到資源管理時(shí),對(duì)象A擁有對(duì)象B如果它控制著對(duì)象B的生存期。例如,成員變量由它們各自的對(duì)象擁有,因?yàn)槌蓡T變量的生存期與對(duì)象的生存期相關(guān)聯(lián)。根據(jù)對(duì)象的擁有方式選擇智能指針。

請(qǐng)注意,軟件系統(tǒng)中的所有權(quán)與所有權(quán)是分開的,就像我們?cè)谲浖馑J(rèn)為的那樣。例如,一個(gè)人可能“擁有”他們的家,但這并不一定意味著Person對(duì)象的生存期具有控制權(quán)。House對(duì)象。將這些真實(shí)世界的概念和軟件概念混為一談是一種讓自己陷入困境的可靠方法。


如果您擁有該對(duì)象的唯一所有權(quán),請(qǐng)使用std::unique_ptr<T>.

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

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

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


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

費(fèi)用:

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

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

例子:

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

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

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

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


查看完整回答
反對(duì) 回復(fù) 2019-06-20
  • 3 回答
  • 0 關(guān)注
  • 522 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)