gpt4 book ai didi

c++ - shared_ptr 和循环引用

转载 作者:可可西里 更新时间:2023-11-01 16:27:27 26 4
gpt4 key购买 nike

我尝试使用 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 中提到的循环引用?因为,在注释 1)2) 之后,我期望对 p1 的间接引用的不同输出。所以这段代码不需要boost::weak_ptr!那么需要 weak_ptr 的循环引用是什么?

提前致谢。

最佳答案

是的,您误解了这一点。在你的例子中,所有的指针都指向同一个对象,没有形成任何循环。

将 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_ptr 中的对象永远不会被破坏,即使在您离开 main 之后也是如此。

关于c++ - shared_ptr 和循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12338226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com