weak_ptr
weak_ptr是一种不控制所指向对象的生存期的智能指针,它指向由一个shared_ptr所管理的对象。将一个weak_ptr绑定到shared_ptr上面不会改变shared_ptr的引用计数。
一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。
创建
auto p = make_shared<int>(42);
weak_ptr<int>q(p);//q弱共享p,p的引用计数不会改变
访问
由于对象可能不存在,我们不能使用weak_ptr直接访问对象,而必须调用lock。
if (shared_ptr<int> np = q.lock()){//如果np不为空则条件成立
//在if中,np与p共享对象
}
weak_ptr与循环引用
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; // 这还不算是循环引用
y->ptr = x; // 现在算是循环引用了, x使y保持存活y使x保持存活。他们两个的计数至少为1,永远不会变成0。
}
这个时候,只需要把其中一个shared_ptr改成weak_ptr就可以解决这个问题了。