【C/C++】【智能指针】weak_ptr

weak_ptr

weak_ptr概述: 用来辅助shared_ptr进行工作
week 弱 弱共享 弱引用 共享其他shared_ptr所指向的对象
强指针指的是 shared_ptr  弱指针指的是 weak_ptr 
weak_ptr 也是类模板,也是智能指针,这个智能指针用来指向一个shared_ptr管理的对象

1) weak_ptr 不控制所指对象的声明周期,即将weak_ptr绑定到shared_ptr并不会改变shared_ptr的引用计数
   更确切的说weak_ptr的构造和析构不会增加或者减少所指向对象的引用计数

2) 当shared_ptr需要释放所指向的对象的时候可以照常释放,不管是否有weak_ptr指向该对象

3) weak_ptr的作用:可以理解成监视shared_ptr (强引用)的声明周期用的,是一种shared_ptr的扩充
    weak_ptr不是一种独立的智能指针,不能用来操作所指向的资源,看起来像是shared_ptr的助手
    weak_ptr能监视到它所指向的对象是否存在

weak_ptr的创建

//weak_ptr的创建
void func1()
{
    //创建weak_ptr的时候,一般是用一个shared_ptr来初始化
    auto pi = make_shared<int>(100); //shared_ptr

    //pi引用计数(强引用计数)不改变,但是弱引用计数会改变(弱引用计数会从0变成1)
    //强引用计数才能决定对象的声明期,弱引用计数对对象声明周期没有影响
    weak_ptr<int> piweak(pi); //piweak弱共享pi


    //另一种初始化
    weak_ptr<int> piweak1; //piweak弱共享pi
    piweak1 = pi; //把weak_ptr赋值给另外一个weak_ptr,现在pi是一个强引用,piweak和piweak1是两个弱引用



    //lock(): 功能就是检查weak_ptr所指向的对象是否存在
    //存在:lock就能返回一个指向该对象的shared_ptr, 指向的shared_ptrd的引用计数 + 1

    //auto pi2 = piweak.lock(); //pi2也是一个强引用
    //if (pi2) cout << " exists " << endl;

    //不存在:lock会返回一个空的shared_ptr
    pi.reset();
    auto pi3 = piweak.lock(); //pi2也是一个强引用
    if (pi3) cout << " exists " << endl;
    else cout << "not exists " << endl;

    //总结:weak_ptr能够判断所指向的对象是否存在
}

weak_ptr常用操作

/*weak_ptr常用操作*/
namespace _weak_ptr_op_
{
    //1. user_count():获取与该弱指针共享对象的其他shared_ptr的数量,或者获取当前观测资源的强引用计数
    void func1()
    {
        auto pi = make_shared<int>(100);
        auto pi2(pi);
        weak_ptr<int> p(pi);
        cout << pi.use_count() << endl;
    }

    //2. expired() 是否过期的意思,若该指针的use_count为0(表示该弱指针所指向的对象不存在了),返回true
    // 判断所观测的资源是否已被释放
    void func2()
    {
        auto pi = make_shared<int>(100);
        auto pi2(pi);
        weak_ptr<int> p(pi);
        cout << pi.use_count() << endl;
        pi.reset();
        pi2.reset();
        if (p.expired()) cout << "weak_ptr过期" << endl;
    }

    //3. reset():将该弱引用指针设置为空,不影响该对象的强引用数量,但是指向该对象的弱引用会减少1
    void func3()
    {
        auto pi = make_shared<int>(100);
        auto pi2(pi);
        weak_ptr<int> p(pi);
        p.reset(); //pi没有弱引用了
    }

    //4. lock()
    void func4()
    {
        auto p1 = make_shared<int>(42);
        weak_ptr<int> p2(p1);
        if (!p2.expired())
        {
            auto p3 = p2.lock(); //返回一个shared_ptr,并且此时强引用计数为2
            if (p3) cout << *p3 << endl;
            //离开这个范围,强引用计数会恢复为1
        }
        else
        {
            int test;
            test = 1;
            //强引用计数为1
        }
    }
}

尺寸问题

【C/C++】【智能指针】weak_ptr

/*
weak_ptr的尺寸和shared_ptr尺寸一样大,是裸指针的2倍
*/
void func()
{
    weak_ptr<int> pw;
    int* p;
    int pw_len = sizeof(pw); //8个字节 内部有两个指针,一个指向对象类型的指针,一个指向控制块的指针
    int p_len = sizeof(p); //4个字节


    //第一个裸指针指向的是这个智能指针所指向的对象
    auto p1 = make_shared<int>(42);
    weak_ptr<int> p2(p1);

    //第二个裸指针指向一个很大的数据结构(控制块)这个控制块中有
    // 1. 所指对象的强引用计数
    // 2. 所指对象的弱引用计数
    // 3. 其他数据,自定义的删除器的指针等等。

}

原文链接: https://www.cnblogs.com/NaughtyCoder/p/13348233.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    【C/C++】【智能指针】weak_ptr

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/368686

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午6:33
下一篇 2023年3月2日 下午6:33

相关推荐