【发布时间】:2017-04-03 17:05:03
【问题描述】:
shared_ptr/weak_ptr允许在对象上保留弱引用,但我不能阻止接收弱引用的人转换它并将其存储为共享。所以我失去了对对象生命周期的控制。unique_ptr可以控制对象的生命周期,但是没有弱引用机制。
我找不到一种标准的方法来同时获得生命周期控制和弱引用的好处。我不敢相信我是唯一遇到这个问题的人。
标准或增强中是否有任何允许这种行为的内容?
或者是否有一种模式允许这样做而无需重写完整的 smart_ptr 类?
【问题讨论】:
-
相关stackoverflow.com/questions/17536731/…。也有
std::experimental::observer_ptr,但删除unique_ptr后不会变为null。 -
这就是
weak_ptr的意义所在。当客户端使用引用的对象时,它会在使用期间将其转换为共享对象,这样它就不会被删除。拥有weak_ptr的客户端在使用它之前需要某种方式来承担对象生命周期的部分所有权。 -
unique_ptr 的情况下不需要类似weak_ptr 的机制,因为存储在其中的对象的生命周期必须超过对其的所有引用的生命周期,并且引用该对象的所有代码都可以使用这些没有任何额外检查的引用。如果代码的某些部分实际上可能期望该对象不存在,那么最好通过boost::optional_reference 之类的方式授予它对对象的访问权限。