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;

}

5.4c++:weak_ptr 概述 、weak_ptr的常用操作,尺寸