亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

智能指針:誰擁有對象?

智能指針:誰擁有對象?

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

3 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

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

shared_ptr -參考計數,計數器達到零時釋放

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

auto_ptr-當創建和釋放發生在同一個函數中時,或者當對象必須被視為只有一個所有者時。當您將一個指針分配給另一個指針時,第二個指針會從第一個“竊取”對象。

我有自己的實現,但也可以在中找到它們Boost。

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

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


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

TA貢獻1801條經驗 獲得超8個贊

簡單的C ++模型

在大多數模塊中,默認情況下,我看到的是假定接收指針獲得所有權。實際上,放棄指針所有權的函數/方法非常罕見,并且在其文檔中明確表達了這一事實。

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

在此模型中,原始指針可以自由循環并且幾乎沒有危險(但是,如果開發人員足夠聰明,他/她將盡可能使用引用代替)。

  • 原始指針

  • std :: auto_ptr

  • boost :: scoped_ptr

智能指針C ++模型

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

  • boost :: shared_ptr

  • 提升:: weak_ptr

結論

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


查看完整回答
反對 回復 2019-10-14
?
藍山帝景

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

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


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


查看完整回答
反對 回復 2019-10-14
  • 3 回答
  • 0 關注
  • 451 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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