shared_ptr的和循环引用(shared_ptr and cyclic references)

2019-06-28 01:46发布

我用的循环引用尝试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 ? 因为,我预计间接引用的不同输出思维p1的意见后, 1)2) 所以这个代码不需要boost::weak_ptr ! 那么,什么是在循环引用weak_ptr s就需要?

提前致谢。

Answer 1:

是的,你误解了这一点。 在你的榜样,所有指针都指向同一个对象,没有形成任何周期。

P4到P2的分配是一个空操作,因为这些指针已经等于开始。

下面是与真正的循环引用一个例子,也许会清楚些:

struct A
{
  std::shared_ptr<A> ptr;
};

void main()
{
  std::shared_ptr<A> x=std::make_shared<A>();
  std::shared_ptr<A> y=std::make_shared<A>();

  x->ptr = y; // not quite a cycle yet
  y->ptr = x; // now we got a cycle x keeps y alive and y keeps x alive
}

你甚至可以让这个更简单:

void main()
{
  std::shared_ptr<A> x=std::make_shared<A>();

  x->ptr = x; // never die! x keeps itself alive
}

在这两个例子中,shared_ptrs的对象永远不会破坏,你离开主甚至后。



Answer 2:

只是想指出:之所以输出的第二行是5 ,而不是4不是因为的s->i++增加,但由于shared_ptr<A> s参数是由值来传递。

当打电话

p1 = changeI(p4); // 2) 2nd cyclic ref.

p4将被复制到另一个shared_pointer ,暂时增加use_count功能的范围期间由一个。

也许我在玩队长显然这里(;



文章来源: shared_ptr and cyclic references