我想了解一下如何(使用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
太棒了!谢谢。顺便说一句好的网站! –