【发布时间】:2012-09-02 12:36:00
【问题描述】:
我正在尝试使用 boost::shared_ptr 的循环引用,并设计了以下示例:
class A{ // Trivial class
public:
i32 i;
A(){}
A(i32 a):i(a){}
~A(){
cout<<"~A : "<<i<<endl;
}
};
shared_ptr<A> changeI(shared_ptr<A> s){
s->i++;
cout<<s.use_count()<<'\n';
return s;
}
int main() {
shared_ptr<A> p1 = make_shared<A>(3);
shared_ptr<A> p2 = p1;
shared_ptr<A> p3 = p2;
shared_ptr<A> p4 = p3;
p1 = p4; // 1) 1st cyclic ref.
cout<<p1.use_count()<<'\n';
p1 = changeI(p4); // 2) 2nd cyclic ref.
cout<<p1.use_count()<<'\n';
// putchar('\n');
cout<<endl;
}
哪个输出
4
5
4
~A : 4
是不是我误解了boost::shared_ptr 提到的循环引用?因为,我期望在 cmets 1) 和 2) 之后对 p1 的间接引用会有不同的输出思考。
所以这段代码不需要boost::weak_ptr!那么需要weak_ptrs 的循环引用是什么?
提前致谢。
【问题讨论】:
-
5 的中间结果是由于将共享指针对象按值传递给函数导致共享指针的新副本为 s
标签: c++ shared-ptr weak-ptr cyclic-reference