让我重复您的问题:“我的问题是,循环数据结构如何使引用计数大于零,请请求在C ++程序中用示例显示。weak_ptrs
请用示例再次解决问题。”
这样的C ++代码会发生此问题(从概念上):
class A { shared_ptr<B> b; ... };
class B { shared_ptr<A> a; ... };
shared_ptr<A> x(new A);
x->b = new B;
x->b->a = x;
要回答问题的第二部分:在引用计数上处理周期在数学上是不可能的。因此,a weak_ptr
(基本上只是的简化版本shared_ptr
)不能用于解决循环问题-程序员正在解决循环问题。
为了解决这个问题,程序员需要了解对象之间的所有权关系,或者如果自然不存在这种所有权,就需要发明一种所有权关系。
可以更改上面的C ++代码,以便A拥有B:
class A { shared_ptr<B> b; ... };
class B { weak_ptr<A> a; ... };
shared_ptr<A> x(new A);
x->b = new B;
x->b->a = x;
一个关键问题是:weak_ptr
如果程序员由于缺乏特权或信息而无法告知所有权关系并且无法建立任何静态所有权,是否可以使用?
答案是:如果对象之间的所有权不清楚,weak_ptr
将无济于事。如果有一个循环,程序员必须找到它并中断它。一种替代方法是使用具有完整垃圾收集的编程语言(例如:Java,C#,Go,Haskell),或使用与C / C ++一起使用的保守的(=不完美)垃圾收集器(例如:Boehm GC) 。