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

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

智能指針:誰擁有對象?

智能指針:誰擁有對象?

C++
拉風(fēng)的咖菲貓 2019-10-14 10:27:36
C ++全部關(guān)于內(nèi)存所有權(quán)(也稱為所有權(quán)語義)。動(dòng)態(tài)分配的內(nèi)存塊的所有者負(fù)責(zé)釋放該內(nèi)存。因此,問題實(shí)際上變成了誰擁有記憶。在C ++所有權(quán)中,原始指針被包裝在其中,因此在一個(gè)良好的(IMO)C ++程序中,很少會(huì)看到原始指針傳遞(罕見,不是從來沒有)(因?yàn)樵贾羔槢]有推斷出的所有權(quán),因此我們可以不知道誰是內(nèi)存的所有者,因此,如果不仔細(xì)閱讀文檔,就無法知道誰對內(nèi)存負(fù)責(zé)。相反,很少看到原始指針存儲(chǔ)在類中,每個(gè)原始指針都存儲(chǔ)在其自己的智能指針包裝器中。(注意:如果您不擁有某個(gè)對象,則不應(yīng)存儲(chǔ)該對象,因?yàn)槟恢涝搶ο蠛螘r(shí)會(huì)超出范圍并被破壞。)所以問題是:人們遇到過哪種所有權(quán)語義?哪些標(biāo)準(zhǔn)類用于實(shí)現(xiàn)這些語義?您覺得它們在什么情況下有用?讓我們?yōu)槊總€(gè)答案保留一種類型的語義所有權(quán),以便可以分別對它們進(jìn)行表決。摘要:從概念上講,智能指針很簡單,簡單的實(shí)現(xiàn)也很容易。我已經(jīng)看到了許多嘗試的實(shí)現(xiàn),但是它們總是以某種偶然使用和示例不明顯的方式被破壞。因此,我建議始終使用庫中經(jīng)過良好測試的智能指針,而不要自己動(dòng)手。std::auto_ptr或Boost智能指針之一似乎可以滿足我的所有需求。std::auto_ptr<T>:一個(gè)人擁有該對象。允許轉(zhuǎn)讓所有權(quán)。用法:這允許您定義顯示所有權(quán)顯式轉(zhuǎn)移的接口。boost::scoped_ptr<T>一個(gè)人擁有該對象。不允許轉(zhuǎn)讓所有權(quán)。用法:用于顯示明確的所有權(quán)。對象將由析構(gòu)函數(shù)或明確重置后銷毀。boost::shared_ptr<T>(std::tr1::shared_ptr<T>)多重所有權(quán)。這是一個(gè)簡單的引用計(jì)數(shù)指針。當(dāng)引用計(jì)數(shù)達(dá)到零時(shí),對象將被銷毀。用法:一個(gè)對象可以具有多個(gè)編譯器,且其生存期在編譯時(shí)無法確定。boost::weak_ptr<T>:用于shared_ptr<T>可能發(fā)生指針循環(huán)的情況。用法:僅當(dāng)循環(huán)維護(hù)共享引用計(jì)數(shù)時(shí),用于停止保留對象的循環(huán)。
查看完整描述

3 回答

?
慕仙森

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

對我來說,這三種可以滿足我的大部分需求:

shared_ptr -參考計(jì)數(shù),計(jì)數(shù)器達(dá)到零時(shí)釋放

weak_ptr-與上述相同,但它是的“從屬” shared_ptr,無法取消分配

auto_ptr-當(dāng)創(chuàng)建和釋放發(fā)生在同一個(gè)函數(shù)中時(shí),或者當(dāng)對象必須被視為只有一個(gè)所有者時(shí)。當(dāng)您將一個(gè)指針分配給另一個(gè)指針時(shí),第二個(gè)指針會(huì)從第一個(gè)“竊取”對象。

我有自己的實(shí)現(xiàn),但也可以在中找到它們Boost。

我仍然通過引用傳遞對象(const在可能的情況下),在這種情況下,被調(diào)用方法必須假定對象僅在調(diào)用期間處于活動(dòng)狀態(tài)。

我使用的另一種指針稱為hub_ptr。這是當(dāng)您有一個(gè)必須從嵌套在其中的對象(通常作為虛擬基類)訪問的對象時(shí)??梢酝ㄟ^將a傳遞weak_ptr給他們來解決,但本身沒有a shared_ptr。眾所周知,這些對象的壽命不會(huì)比他長,因此將hub_ptr傳遞給它們(它只是常規(guī)指針的模板包裝器)。


查看完整回答
反對 回復(fù) 2019-10-14
?
蝴蝶刀刀

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

簡單的C ++模型

在大多數(shù)模塊中,默認(rèn)情況下,我看到的是假定接收指針獲得所有權(quán)。實(shí)際上,放棄指針?biāo)袡?quán)的函數(shù)/方法非常罕見,并且在其文檔中明確表達(dá)了這一事實(shí)。

該模型假定用戶僅是他/她明確分配的所有者。其他所有內(nèi)容都會(huì)自動(dòng)清除(在示波器出口或通過RAII)。這是一個(gè)類似C的模型,擴(kuò)展了以下事實(shí):大多數(shù)指針歸對象所有,這些對象將自動(dòng)或在需要時(shí)(通常在銷毀對象時(shí))釋放它們,并且對象的生存期是可預(yù)測的(RAII是您的朋友,再次)。

在此模型中,原始指針可以自由循環(huán)并且?guī)缀鯖]有危險(xiǎn)(但是,如果開發(fā)人員足夠聰明,他/她將盡可能使用引用代替)。

  • 原始指針

  • std :: auto_ptr

  • boost :: scoped_ptr

智能指針C ++模型

在充滿智能指針的代碼中,用戶可以希望忽略對象的生存期。所有者永遠(yuǎn)不是用戶代碼:它是智能指針本身(再次是RAII)。問題在于,將循環(huán)引用與引用計(jì)數(shù)的智能指針混合使用可能是致命的,因此您必須同時(shí)處理共享指針和弱指針。因此,您仍然需要考慮所有權(quán)(弱指針可能毫無意義,即使它比原始指針的優(yōu)勢在于它可以告訴您)。

  • boost :: shared_ptr

  • 提升:: weak_ptr

結(jié)論

無論我描述的模型是什么,除非有例外,否則接收指針都不會(huì)獲得其所有權(quán),知道誰擁有誰仍然非常重要。即使對于C ++代碼,也大量使用引用和/或智能指針。


查看完整回答
反對 回復(fù) 2019-10-14
?
藍(lán)山帝景

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

從boost開始,還有指針容器庫。如果僅在對象的上下文中使用對象,則這些對象比標(biāo)準(zhǔn)的智能指針容器要有效且易于使用。


在Windows上,有COM指針(IUnknown,IDispatch和Friends),以及用于處理它們的各種智能指針(例如ATL的CComPtr和Visual Studio中基于_com_ptr類由“ import”語句自動(dòng)生成的智能指針)。)。


查看完整回答
反對 回復(fù) 2019-10-14
  • 3 回答
  • 0 關(guān)注
  • 442 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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