ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++11:20weak_ptr弱引用的智能指针

2020-05-25 19:06:12  阅读:283  来源: 互联网

标签:11 std cout weak C++ 20weak shared ptr 指针


20、weak_ptr弱引用的智能指针

0、课前秀

  • 弱引用指针weak_ptr是用来监视shared_ptr的,不会使引用计数加1,它不管理shared_ptr内部的指针,主要是为了监视shared_ptr的生命周期。
  • weak_ptr没有重载操作符*->,因为它不共享指针,不能操作资源。
  • weak_ptr还可以用来返回this指针和解决循环引用的问题。

1、weak_ptr基本用法

  • (1)通过use_count()方法来获得当前观测资源的引用计数
shared_ptr<int> sp(new int(10));
weak_ptr<int> wp(sp);

cout<<wp.use_count()<<endl; //结果将输出1
  • (2)通过expired()方法来判断所观测的资源是否已经被释放
shared_ptr<int> sp(new int(10));
weak_ptr<int> wp(sp);
if(wp.expired())
	std::cout << "weak_ptr无效,所监视的智能指针已被释放\n";
else
	std::cout << "weak_ptr有效\n";
//结果将输出:weak_ptr有效
  • (3)通过lock方法来获取所监视的shared_ptr
std::weak_ptr<int> gw;
void f()
{
    if(gw.expired()) //所监视的shared_ptr是否释放
    {
        std::cout << "gw is expired\n";
    }
    else
    {
        auto spt = gw.lock();
        std::cout << *spt << "\n";
    }
}

int main()
{
    {
        auto sp = std::make_shared<int>(42);
        gw = sp;
        f();
    }
    f();
}

/*
输出:
42
gw is expired
*/

2、weak_ptr返回this指针

  • 代码
struct A: public std::enable_shared_from_this<A>
{
    std::shared_ptr<A> GetSelf()
    {
        return shared_from_this();
    }
    ~S()
    {
        cout<<"A is deleted"<<endl;
    }
};
std::shared_ptr<A> spy(new A);
std::shared_ptr<A> p = spy->GetSelf();//OK
/*
输出结果
A is deleted
*/

3、weak_ptr解决循环引用问题

  • 代码
struct A;
struct B;
struct A{
    std::shared_ptr<B> bptr;
    ~A() {cout<<"A is deleted!"<<endl;}
};

struct B{
    std::shared_ptr<A> aptr;//将A B中的任何一个改成 weak_ptr
    ~B() {cout<<"B is deleted!"<<endl;}
};

void TestPtr()
{
    {
        std::shared_ptr<A> ap(new A);
        std::shared_ptr<B> bp(new B);
        ap->bptr = bp;
        bp->aptr = ap;
    }//Objects should be destroyed
}

ReadMe

  • 20200525上班期间开了个头,看了一点点,晚上回来后整理起来的,基本没有串起的,只是个记录,后面再看呢。

标签:11,std,cout,weak,C++,20weak,shared,ptr,指针
来源: https://www.cnblogs.com/fewolflion/p/12960302.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有