我想了解一下如何(使用C++ 11,並希望與向後(升壓或TR1)兼容的智能指針類型)實現:共享資源OWNAGE使用std :: weak_ptr的
一個類的實例(ModelController
)擁有一個資源(InputConsumer
),而另一個組件(InputSender
,在本例中是單身人士)可以訪問它。
該模型是InputSender
持有引用InputConsumers
,其中會有很多的列表。
ModelController
可能沒有,一個或多個InputConsumers
,並且可能有很多ModelController
s。 InputSender
不知道。
以下是最好的方法:InputSender
跟蹤分配給它的InputConsumers
,以這樣一種方式,它可以找出個人InputConsumers
是否有效。
在我看來,weak_ptr
是完美的,因爲他們的使用需要檢查這種情況。
如果InputSender
停止跟蹤其任何weak_ptr
裁判,沒有什麼不好的事情發生,相應的InputConsumer
將只是體驗無線電沉默。
如果ModelController
被刪除,或者如果ModelController
刪除一些InputConsumer
S的,這與他們註冊的任何InputSender
旨意認識到在他們試圖訪問他們,他們不再存在接下來的時間,並且可以清理,而不需要發送消息或做任何事情。
所以問題是,這是一個適當的情況下使用shared_ptr
和weak_ptr
?我想知道shared_ptr
是否完全合適,因爲InputConsumer
在概念上是擁有其ModelController
s,所以它們應該是成員變量。我不知道ModelController
只能通過shared_ptr
來管理它們。我不知道unique_ptr
是否與weak_ptr
一起工作。我是否應該管理ModelController
的ctor/dtor中的shared_ptr
?
可能還有一個衆所周知的(不是我!)設計模式,所以如果有人知道這樣的事情,請告訴我。
這聽起來很酷,但它不是立即清楚如何去消除它們!你能發表一個小例子嗎?謝謝! –
@StevenLu我以前從來沒有使用過別名,所以我不得不學習細節,而且實際上我預料會更棘手。無論如何,這是值得的努力,現在我理解他們很好,並有一個工作示例,我與你分享(見編輯)。另一種方法是不使用這些別名,並直接使用'Owner():foo1_ptr(new Foo){}'初始化'Owner'的'shared_ptr foo1_ptr'成員,然後直接使用'Observer observer(owner-> foo1_ptr)',但是這會在您希望避免的堆上創建數據。 –
Boris
太棒了!謝謝。順便說一句好的網站! –