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ī)指針的模板包裝器)。

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 ++代碼,也大量使用引用和/或智能指針。

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)生成的智能指針)。)。
- 3 回答
- 0 關(guān)注
- 442 瀏覽
添加回答
舉報(bào)