5.4c++:weak_ptr 概述 、weak_ptr的常用操作,尺寸
weak_ptr 概述
//weak弱 shared_ptr强
//weak_ptr:也是一个类模板,也是一个智能指针。
//这个智能指针指向一个由shared_ptr管理的对象。
//但是weak_ptr这种智能指针不控制所指向的对象的生命周期
//换句话来说:将weak_ptr绑定到shared_ptr上不会改变shared_ptr的引用计数
//当shared_ptr需要释放所指向对象的时候照常释放,不管是否有weak_ptr指向该对象
//弱:就是能力弱,(弱共享、弱引用:共享其它的shared_ptr所指向的对象)
//控制不了所指向对象的生存期。
//作用:这个弱引用(weak_ptr)的作用:监视 shared_ptr(强引用)的生命周期。是对shared_ptr的扩充
//weak_ptr:不是一种独立的智能指针。不能用来操作所指向的资源,像是shared_ptr的助手。
//weak_ptr能够监视到它所指向的对象是否存在。
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
int main()
{
//weak_ptr的创建
auto pi = make_shared<int> (120);//shared_ptr
//weak_ptr<int> piw(pi);//piw弱共享pi,pi引用计数不改变,但是弱引用计数会改变。
//强引用计数才能决定对象的生存期,弱引用计数并没有影响。
weak_ptr<int> piw;
piw = pi;
weak_ptr<int> piw2;
piw2 = piw;
//lock():检查weak_ptr所指向的对象是否存在,如果存在,那么这个lock那么这个
//lock就返回一个指向该对象的shared_ptr(指向强引用计数就会加1)
//如果不存在,lock会返回一个空的shared_ptr
auto pi2 = piw.lock();//pi2是一个shared_ptr
if(pi2 != nullptr)
{
*pi2 = 12;
cout << *pi2 << endl;
}
//以上代码 :weak_ptr能判断所指向的对象是否存在
return 0;
}
weak_ptr的常用操作
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
int main()
{
//(1) use_ptr:获取与该弱指针共享对象的其他shared_ptr的数量,或者说获得当前所观测的
//资源的强应用计数
auto pi = make_shared<int>(100);
auto pi2(pi);
weak_ptr<int>piw(pi);
int isc = piw.use_count();
cout << isc << endl;//2
//(2)expired():是否过期的意思。若该指针的use_count()为0,表示该弱指针所指向的对象
//已经不存在。则返回 true
//这个函数用来判断 所观测的资源是否已经被释放。
pi.reset();
pi2.reset();
if(piw.expired() )
{
cout <<"对象已经过期"<<endl;
}
//(3)reset() :将该弱引用指针置为空,不影响指向该对象的强引用数量,但指向该对象的
//弱引用数量会减少。
piw.reset();
isc = piw.use_count();
cout << isc << endl;
//(4)lock()
auto p1 = make_shared<int> (42);
weak_ptr<int> pw;
pw = p1;//可以用shared_ptr给weak_ptr赋值
if(!pw.expired())
{
auto p2 = pw.lock();//返回一个shared_ptr 并且 此时强引用计数为2
if(p2 != nullptr)
{
//做一些操作
int test;
test = 1;
//离开这个范围,强引用计数 会恢复为1
}
}
else
{
//已经过期
int test;
test = 1 ;
}
return 0;
}
尺寸问题
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
int main()
{
//尺寸问题
//大小是裸指针的2倍
//weak_ptr和shared_ptr的尺寸一样大
weak_ptr<int> pw;
int *p;
int ilen1 = sizeof(p);//4 裸指针
int ilen2 = sizeof(pw);//8 内部有两个裸指针 。见图
cout << ilen1 << " " << ilen2 << endl;
return 0;
}