weak_ptr

weak_ptr是为配合shared_ptr而引入的一种智能指针来协助shared_ptr工作,它可以从一个shared_ptr或另一个weak_ptr对象构造,它的构造和析构不会引起引用记数的增加或减少。没有重载*和->但可以使用lock获得一个可用的shared_ptr对象
template<class T> class weak_ptr
{
public:
    weak_ptr();

    template<class Y> weak_ptr(shared_ptr<Y> const & r);
    weak_ptr(weak_ptr const & r);

    ~weak_ptr();
    weak_ptr & operator=(weak_ptr const & r);

    long use_count()const;
    //判断是否过期
    bool expired()const;
    //得到一个空的或者被协助的shared_ptr
    shared_ptr<T> lock()const;

    void reset();
    void swap(weak_ptr<T> & b);
};



#include<iostream>
#include<boost/weak_ptr.hpp>
#include<boost/shared_ptr.hpp>
using namespace std;
using namespace boost;

int main()
{
    shared_ptr<int> p(new int(10));
    weak_ptr<int> w(p);
    while(!w.expired()){
        cout << w.use_count() << endl;
        shared_ptr<int> t = w.lock();
        cout << *t << endl;
        cout << w.use_count() << endl;
        if(w.use_count()==2){
            break;
        }
    }
    w.reset();
    cout << w.expired() << endl;
}

1
10
2
1


weak_ptr的一个重要用途是通过lock获得this指针的shared_ptr,使对象自己能够生产shared_ptr来管理自己,但助手类enable_shared_from_this的shared_from_this会返回this的shared_ptr,只需要让想被shared_ptr管理的类从它继承即可

#include<boost/enable_shared_from_this.hpp>
#include<boost/make_shared.hpp>
#include<iostream>
using namespace boost;
using namespace std;

class testWeak:public enable_shared_from_this<testWeak>{//
public:
    int i;
    testWeak(int ii):i(ii){}
    void print(){
        cout << i << endl;
    }
};

int main()
{
    shared_ptr<testWeak> sp = make_shared<testWeak>(100);
    shared_ptr<testWeak> tw = sp->shared_from_this();
    tw->print();
}

100

你可能感兴趣的:(C++,c,工作,C#)