一种不同的共享所有权

时间:2012-04-28 12:10:39

标签: c++ shared-ptr

C ++中的shared_ptr来解决问题,当多个对象拥有对象的所有权时会多次删除。它只通过最后一次删除来实现。
当一个对象想要所有权但又不想延迟删除时,该指针还有另一种风格,因此它需要一个弱指针,当它被删除时会通知他以防止出现问题。
还有另一种方法。不要只进行最后一次删除,只进行第一次删除,并通知其余的对象,就像弱指针一样。 这对于像连接这样的对象很有用,如果一端释放它,它应该被销毁,而另一端知道这一点 在C ++或Boost中有这样的东西吗?

2 个答案:

答案 0 :(得分:0)

此模式可以使用单个共享的互斥shared_ptr建模,仅用于创建和销毁对象,并为每个客户端/端点使用weak_ptr,用于访问。

请注意,这样的方案会导致过度锁定,并且可能无法提供您想要的语义。在使用过程中,您需要lock weak_ptr,这会触及shared_ptr内部互斥锁。当一方破坏主shared_ptr实例时,该对象在任何读取操作完成时仍然存在。

更传统的解决方案是通过频道本身传输挂断信息。

答案 1 :(得分:0)

有几种类型的通知

  • 同步
  • 异步
  • 按需(实际上不是通知)

根据您的真实需要,实施可能会有很大差异。

后者(按需)已经通过典型的shared_ptr / weak_ptr二分法提供:当通过weak_ptr访问对象时,您将知道它是否已被删除同时

另外两个可以通过传统shared_ptr之上的Observer模式实现,但是它们具有复杂性和性能影响,所以在使用之前我会确保需要是真实的。