2010-11-07 71 views
1

我有一个设计,其中的对象同时拥有2个队列。偶尔队列本身可能会被删除。在这种情况下,必须删除队列中的所有对象并将它们从其他队列中删除。引用计数智能指针删除拥有的对象ref ref大于零?

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

有智能指针类可以帮助我吗?构造可以是“新”或现有指针的副本。销毁将删除所拥有的资源。访问将像weak_ptr一样,提供指向null的可能性。

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

有没有人知道这样的事情?

感谢, 托尼

回答

1

你要排队对象的缺失,从其他队列中删除它,没有它连接到队列中。

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

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

谢谢。这听起来不错,但是如果一个队列死掉,并且我们在另一个队列中“挂起”包装器(并且仍然是实际排队的对象),它们何时被删除?我想不是忽略已标记的死亡物品,而是删除它们。 – 2010-11-07 23:46:11

+0

Probem在这里将是如果一个队列变得安静但没有被删除。也许队列可以定期搜索死对象。 – 2010-11-07 23:49:02

+0

您是否定期从每个队列中拉出项目?如果是这样,上述“何时”问题的答案是“当它们从另一个队列中移除时。“在第二个评论中,”安静“的意思是什么? – 2010-11-08 00:10:25

0

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

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

+0

感谢您的回答。我google了'参考周期'。我不相信循环是一个问题在这里,虽然我明白了为什么它们会影响一般情况,因此为什么没有通用的解决方案。 Andy的回答看起来有点像垃圾收集器,也许这是一条路。 – 2010-11-08 00:23:33

0

您可以使用boost::shared_ptr将对象存储在队列中。这是一个非常准确的非侵入式引用计数类。该图书馆还有一个weak_ptr类非拥有观察。

+0

问题请求从一个队列中删除的对象也被“从其他队列中删除”。 – 2010-11-08 15:08:08

+0

什么能够防止一个队列在销毁期间从另一个队列中取出其对象? – noxmetus 2010-11-08 18:30:08

+0

队列必须彼此了解。具体来说,对于他们拥有的每个对象,他们需要一个指向另一个队列的指针。 – 2010-11-08 23:00:44