boost::weak_ptr 观察者

本文深入解析了boost::weak_ptr的功能和使用场景,包括其作为boost::shared_ptr观察者的角色,以及如何通过use_count(), expired()和lock()等成员函数监测和操作共享资源。通过实例代码演示了weak_ptr在资源管理中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

boost::weak_ptr 作为 boost::shared_ptr 的观察者,更像是助手,观察 shared_ptr 对象是否内存有效。

boost::weak_ptr内几个重要成员函数:

1. 成员函数use_count() 观测资源引用计数

2. 成员函数expired() 功能相当于 use_count()==0  表示被观测的资源(也就是shared_ptr的管理的资源)是否被销毁

3. 成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象, 进而操作资源。但当expired()==true的时候,lock()函数将返回一个存储空指针的shared_ptr

class CTxxx {
public:    
CTxxx() {printf( "CTxxx cst\n" );}
~CTxxx() {printf( "CTxxx dst\n" );    
};
int tst_1(int argc, char *argv[]) {
    boost::shared_ptr<CTxxx> sp_ct(new CTxxx);
    boost::weak_ptr<CTxxx> wk_ct = sp_ct;
    boost::weak_ptr<CTxxx> wka1;
    {
        std::cout << "wk_ct.expired()=" << wk_ct.expired() << std::endl;
        boost::shared_ptr<CTxxx> tmpP = wk_ct.lock();
        if (tmpP) {
            std::cout << "tmpP usecount=" << tmpP.use_count() << std::endl;
        } else {
            std::cout << "tmpP invalid" << std::endl;
        }
        boost::shared_ptr<CTxxx> a1(new CTxxx);
        wka1 = (a1);
    }
    std::cout << "wka1.expired()=" << wka1.expired() << std::endl;
    std::cout << "wka1.lock()=" << wka1.lock() << std::endl;

    boost::shared_ptr<CTxxx> cpySp = wka1.lock();
    if (cpySp) std::cout << "cpySp is ok" << std::endl;
    else std::cout << "cpySp is destroyed" << std::endl;
    return 1;
​​​​​​​}

输出:

20181119 14:16:59.822724Z 17139 INFO  pid = 17139, tid = 17139 - main.cpp:53
CTxxx cst
wk_ct.expired()=0
tmpP usecount=2
CTxxx cst
CTxxx dst
wka1.expired()=1
wka1.lock()=0
cpySp is destroyed
CTxxx dst
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值