ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

智能指针weak_ptr记录

2019-12-23 11:56:32  阅读:234  来源: 互联网

标签:std cout sp1 weak shared ptr 指针


智能指针weak_ptr为弱共享指针,实际上是share_ptr的辅助指针,不具备指针的功能。主要是为了协助 shared_ptr 工作,可用来观测资源的使用情况。weak_ptr 只对 shared_ptr 进行引用,而不改变其引用计数,当被观察的 shared_ptr 失效后,相应的 weak_ptr 也相应失效。use_count() 可以观测资源的引用计数,lock()返回一个对象的可用的share_ptr,若weak_ptr.expired()为true过期,则返回一个空的share_ptr。

构造:

std::shared_ptr<int> sp(new int);
std::weak_ptr<int> wp1;
std::weak_ptr<int> wp2(wp1);
std::weak_ptr<int> wp3(sp);
std::cout << "use_count:\n";
std::cout << "wp1: " << wp1.use_count() << '\n';
std::cout << "wp2: " << wp2.use_count() << '\n';
std::cout << "wp3: " << wp3.use_count() << '\n';

输出引用计数:

 

过期判断:

std::shared_ptr<int> shared(new int(10));
std::weak_ptr<int> weak(shared);
std::cout << "1. weak " << (weak.expired() ? "is" : "is not") << " expired\n";
shared.reset();
std::cout << "2. weak " << (weak.expired() ? "is" : "is not") << " expired\n";

输出:

 

lock()返回可用的share_ptr或空share_ptr

std::shared_ptr<int> sp1, sp2;
std::weak_ptr<int> wp;
sp1 = std::make_shared<int>(20); // sp1
wp = sp1;                        // sp1, wp
sp2 = wp.lock();                 // sp1, wp, sp2
sp1.reset();                     //      wp, sp2
sp1 = wp.lock();                 // sp1, wp, sp2
std::cout << "*sp1: " << *sp1 << '\n';
std::cout << "*sp2: " << *sp2 << '\n';

输出:

 

#########################################################################################################

一个问题:shared_ptr是采用引用计数的智能指针,多个shared_ptr可以指向同一个动态对象,并共用了一个引用计数器。因此会出现循环引用的问题,导致计数器无法减一,因而内容在该销毁的地方没有释放。

eg:

class Brother;
class Sister
{
public:
    Sister() { cout << "Sister Constructor..." << endl; }
    ~Sister() { cout << "Sister Destructor..." << endl; }
    shared_ptr<Brother> _bro;
};
class Brother
{
public:
    Brother() { cout << "Brother Constructor..." << endl; }
    ~Brother() { cout << "Brother Destructor..." << endl; }
    shared_ptr<Sister> _sis;
};


shared_ptr<Sister> sps = make_shared<Sister>();
shared_ptr<Brother> spb = make_shared<Brother>();
sps->_bro = spb;
spb->_sis = sps;
std::cout << "sps use_cout:" << sps.use_count() << std::endl;
std::cout << "spb use_cout:" << spb.use_count() << std::endl;

输出:

引用计数器为2,析构函数没有调用,出现程序执行完内容没有释放。

 

使用weak_ptr来处理这一问题,只需要将相互引用使用weak_ptr来替换share_ptr的引用即可

class Sister
{
public:
    Sister() { cout << "Sister Constructor..." << endl; }
    ~Sister() { cout << "Sister Destructor..." << endl; }
    weak_ptr<Brother> _bro;
};
class Brother
{
public:
    Brother() { cout << "Brother Constructor..." << endl; }
    ~Brother() { cout << "Brother Destructor..." << endl; }
    weak_ptr<Sister> _sis;
};

同样的输出代码:

正常析构,程序执行完释放内容。

标签:std,cout,sp1,weak,shared,ptr,指针
来源: https://www.cnblogs.com/tyche116/p/12082946.html

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

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

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

ICode9版权所有