2017-04-03 43 views
1

我找不到一个标准的方式来同时拥有终身控制和弱引用的好处。我无法相信我是唯一遇到这个问题的人。

标准中还是有助于这种行为的提升中有什么? 或者有没有一种模式允许这种情况下不重写一个完整的smart_ptr类?

+0

相关http://stackoverflow.com/questions/17536731/shared-ptr-is-to-weak-ptr-as-unique-ptr-is-to-what-。还有'std :: experimental :: observer_ptr',但当unique_ptr被删除时它不会变为空。 – kennytm

+4

这就是'weak_ptr'的一点。当客户端使用被引用的对象时,它将其转换为在使用期限内共享,以便它不被删除。拥有'weak_ptr'的客户端在使用之前需要某种方式来承担对象生命周期的部分所有权。 – lcs

+0

在unique_ptr的情况下,不需要类似weak_ptr的机制,因为存储在其中的对象的生命周期必须超过所有对它的引用的生命周期,并且所有引用此对象的代码都可以使用这些引用,而无需任何额外的检查。如果代码的某些部分实际上可能期望该对象不存在,那么最好通过[boost :: optional_reference](http://www.boost。组织/ DOC /库/ 1_63_0 /库/可选/ DOC/HTML/boost_optional /教程/ optional_references.html)。 – dodo951

回答

-1

好的,没有标准的方法来做到这一点。

解决方案是将unique_ids添加到所有对象,每个需要弱引用的人都存储一个id。

然后我们有一个管理器用公共方法findById(id)保存这些对象的unique_ptr的映射。

这样,内存分配完全由管理器控制,任何人都可以在其上保留弱引用。

+1

这不起作用。你调用'findById(id)',你会得到一个可能随时消失的对象,因为别的东西控制着它的一生?!你怎么用这个?这与无法提升为强指针的弱指针完全相同,并且毫无用处。 –

+0

你是对的,findById(id)返回我称之为TransientPtr的东西,它是一个在使用前必须测试的指针,永远不能被复制或存储。所以我将这个对象用于一个很短的范围,只要我不在我使用它的范围内销毁它,就没有问题。我认为自定义的weak_ptr具有相同的问题,如果我无法将其推广到强指针,则在确保shared_ptr仍然存在的同时,无法使用它。自定义的weak_ptr的优点是,在我的情况下,对象可以被销毁并在稍后(从服务器)重新创建,并且我的id仍然有效。 – Nicolas

+0

那么为什么还要打扰ID呢?为什么不把一个'weak_ptr'封装在只能将它变成'TransientPtr'的类中呢?包装的'weak_ptr'服务于ID的目的,并且函数将它变成一个'TransientPtr'来达到'findById'服务的目的。身份证没有任何用处。 –

1

如果你想控制寿命,它不是一个弱指针。

弱指针可以升级为共享指针。所以,如果你不想共享所有权,你需要传递引用/原始指针。

通过包装weak_ptr而不暴露整个界面,您可以制作自己种类的受限访问的observer_ptr。但是,这在多线程环境下很难安全(可以说是shared_ptr茁壮成长的唯一环境)。

0

你在问不可能。

无法通过代码安全地访问对象,该代码无法延长对象的生命周期以覆盖其访问对象的时间。

要允许外部代码访问对象,还必须允许该代码扩展对象的生命周期以涵盖其访问对象的时间。

相关问题