天天看點

boost::weak_ptr 觀察者

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
           

繼續閱讀