weak_ptr概述:
weak_ptr用来辅助shared_ptr进行工作;
强指针指的是shared_ptr,弱指针值得是weak_ptr;
weak_ptr:也是个类模板,智能指针。这个智能指针指向一个由shared_ptr管理的对象。但是weak_ptr这种指针不控制指针的生命周期,换句话来说,将weak_ptr绑定到shared_ptr上并不会改变shared_ptr的引用计数(更确切的说,weak_ptr的构造和析构不会增加或者减少所指向对象的引用计数)
当shared_ptr需要释放做指定对象的时候照常释放,不管是否有weak_ptr指向该对象。
能力弱(弱共享、若引用):控制不了所指向对象的生命周期;
这个若引用:大家理解成 监视shared_ptr(强引用)的生命周期用。是一种对shared_ptr的扩充。
weak_ptr不是独立的智能指针,不能用来操作所指向的资源,所以它看起来像shared_ptr的扩展工具。
weak_ptr能够监视它所指向的对象是否存在。
weak_ptr创建
auto pi = make_shared<int>(100);
weak_ptr<int> piw(pi); //piw 弱共享 pi,pi引用计数不改变,但是弱引用计数会改变(弱
//引用计数会从0变成1)
weak_ptr<int> piw2;
piw2 = pi; //也可以
只有强引用计数才能决定对象的生命周期,弱引用计数并不影响对象声明周期。
lock():检查weak_ptr所指向的对象是否存在,如果存在那么lock将返回一个指向该对象的shared_ptr(指向对象的强引用就会+1),如果指向对象不存在,lock会返回一个空的shared_ptr
auto pi3 = piw.lock(); //pi3 是一个shared_ptr
if (pi3 != nullptr){
*pi3 = 12
}
weak_ptr常用操作
use_count():获取与该弱指针共享对象的shared_ptr的数量,或者说获得当前所观测的资源的强引用计数;
auto pi = make_shared<int>(100);
auto pi2(pi);
weak_ptr<int> piw(pi);
int ic = piw.use_count(); //获取的是强引用的数量
expired():是否过期的意思。弱指针的use_count()为0(表示该弱指针所指向的对象已经不存在了),则返回true。
这个函数用来观测 所观测的资源是否已经被释放了。
if (piw.expired())
{
cout << "对象已经过期" << endl;
}
reset():将该弱引用指针设置为空,不影响该对象的强引用数量,但是指向该对象的弱引用数量会减少1。
auto p1 = make_shared<int>(12);
weak_ptr<int> pw;
pw = p1;
if( !pw.expired() )
{
auto p2 = pw.lock(); //这里返回一个shared_ptr,此时强引用的计数为2
if (p2 != nullptr)
{
int test;
test = 1;
}
//离开这个范围,强引用的计数会变成1
}
weak_ptr<int> pw;
{
auto p1 = make_shared<int>(12);
pw = p1;
}
//此时,pw会无效,p1离开了作用域会被释放
if( !pw.expired() )
{
auto p2 = pw.lock(); //这里返回一个shared_ptr,此时强引用的计数为2
if (p2 != nullptr)
{
int test;
test = 1;
}
//离开这个范围,强引用的计数会变成1
}
尺寸问题:
weak_ptr<int> pw;
weak_ptr与shared_ptr的尺寸一样大,是裸指针的两倍。
内部有两个裸指针
第一个裸指针指向的是这个智能指针所指向的对象;
第二个所指针指向一个数据结构(控制块),这个控制块里有:
1、引用计数(强引用计数、弱引用计数)
2、其他数据(弱引用删除器等)