引用计数智能指针删除ref count大于零的拥有对象?

时间:2010-11-07 23:05:09

标签: c++ boost smart-pointers

我有一个设计,其中对象同时由2个队列拥有。有时队列本身可能会被删除。在这种情况下,必须删除队列中的所有对象,并将其从其所在的其他队列中删除。

当前的解决方案让拥有的对象了解两个拥有的队列,但这会引入丑陋的耦合。

是否有智能指针类可以帮助我?构造可以是“新”或现有指针的副本。销毁会删除拥有的资源。访问就像一个weak_ptr,可以指向null。

我想它可能需要一个特定的'destroy'方法,以确保指针的临时副本没有释放资源。

有谁知道这样的事情?

谢谢, 托尼

2 个答案:

答案 0 :(得分:1)

您希望删除排队对象以将其从其他队列中删除,而不将其耦合到队列。

避免这种耦合的一种方法是将标记对象删除,而不实际删除它。

  • 使用包装器对象作为队列的成员。逻辑排队的对象有两个包装器对象,每个队列对应一个。
  • 每个包装器都在对象中包含一个boost :: shared_ptr,逻辑上是每个队列的成员。
  • 包装器的析构函数逻辑排队的对象标记为已死。
  • 将项目从队列中拉出时,请忽略标记为已死的项目。

答案 1 :(得分:0)

一般来说,在参考周期存在的情况下,没有任何可重复使用的解决方案来引用计数。有解决方案,但它们要么特定于允许的参考周期模式,要么是垃圾收集器。从描述问题的方式来看,您需要能够找出给定队列拥有的对象(因此您可以删除队列)以及拥有给定对象的队列(因此​​您可以从所有队列中删除对象)。所以你有参考周期。

为了修复丑陋的耦合问题,我建议让队列包含代理对象,每个代理对象拥有真实对象,并知道哪些队列拥有它。队列方法将使用和更新这些代理对象。