shared_ptr和循环引用
shared_ptr and cyclic references
我尝试使用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
s的循环引用是什么呢?
提前谢谢。
是的,您误解了这一点。在您的示例中,所有指针都指向同一个对象,不形成任何循环。
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中的对象永远不会被破坏,即使在您离开main之后也是如此。
我只想指出:输出的第二行是5
而不是4
的原因不是因为s->i++
的增加,而是因为shared_ptr<A> s
参数是按值传递的。
调用时
p1 = changeI(p4); // 2) 2nd cyclic ref.
p4
将被复制到另一个shared_pointer
,在函数的作用域内暂时将use_count
增加一。
也许我在这里扮演的是显而易见的队长(;
相关文章:
- 打破循环引用在C++中更优雅
- 如何编译使用循环引用的代码?
- 关于C++中引用计数和循环引用的概念
- CBasePin 递增对拥有过滤器的引用.循环引用?
- 使用带有循环引用的weak_ptr
- 如何避免成员回调和shared_ptr循环引用?
- std :: make_shared(),std :: feek_ptr和循环引用
- 由于具有循环引用的类中的unique_ptr或向量而导致核心转储
- 我的内存泄漏是由循环引用引起的吗?
- C++:外部对象循环引用
- 使用 std::weak_ptr 和别名构造函数中断循环引用:声音或有问题
- #ifndef是否可以防止循环引用编译器错误
- shared_ptr和循环引用
- boost::序列化和循环引用反序列化
- 两个类之间的循环引用
- 循环引用的问题
- C++11, shared_ptr.reset() 和循环引用
- 如何初始化 const 循环引用成员
- C++中两个类对象的循环引用
- 如何使用std::shared_ptr检测或避免循环引用