智能指针之弱引用的指针

3.weak_ptr--弱引用的智能指针
    用来监视shared_ptr,不管理shared_ptr内部的指针,没有重载操作符*和->,不会增加引用计数
    基本用法:
    1.通过use_count()获得当前观测资源的引用计数
    2.通过expired()判断观测的资源是否已经被释放
    3.通过lock()方法获取所检测的shared_ptr

std::weak_ptr<int> wp;
void f()
{
    if(wp.expired())
    {
        cout << "wp is expired"<<endl;
    }
    else
    {
        auto ap = wp.lock();
        cout << ap << ":" << *ap<<endl;
    }
}
int main(int argc, char *argv[])
{
    {
        auto sp = std::make_shared<int>(10);
        wp=sp;
        f();
    }
    f();

    system("pause");
    return 0;
}

运行结果:

智能指针之弱引用的指针

 

 

使用弱引用指针返回this指针,解决循环引用问题:

  • 使用弱引用指针返回this指针

  不能直接将this指针返回为shared_ptr,需要通过派生类std:enable_shared_from_this,可以通过shared_from_this()方法返回智能指针,其中起作用的就是weak_ptr。在类std::enable_shared_form_this中有一个weak_ptr,这个weak_ptr是用来观测this智能指针的,调用std::shred_from_this()时会调用这个weak_ptr的lock()方法,把观测到的shared_ptr返回。

  需要注意的一点是,获取自身智能指针的函数仅在shared_ptr<T>的构造函数被调用之后才能使用,因为weak_ptr只有通过shared_ptr才能构造。

  • 解决循环引用问题

  智能指针的循环引用会导致内存泄漏,可以通过weak_ptr解决这个问题。

struct A;
struct B;
std::weak_ptr<A> awp;
std::weak_ptr<B> bwp;
struct A
{
    std::shared_ptr<B> bptr;
    ~A() {cout << "A is deleted!"<<endl;}
};
struct B
{
    std::shared_ptr<A> aptr;
    ~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;
        awp = ap;
        printf("ap.usecount = %d\n",awp.use_count());//输出ap.usecount =2
        bwp = bp;
        printf("bp.usecount = %d\n",bwp.use_count());//输出ap.usecount =2

    }
    printf("ap.usecount = %d\n",awp.use_count());//输出ap.usecount =1
    printf("bp.usecount = %d\n",bwp.use_count());//输出ap.usecount =1

}

把A或B中的shared_ptr改为weak_ptr,std::weak_ptr<B> bptr;或std::weak_ptr<A> aptr;

输出如果如下

 智能指针之弱引用的指针

 

 

参考:《深入应用C++11:代码优化与工程级应用》

上一篇:(转)enable_from_this方法的使用与陷阱


下一篇:Java弱引用(WeakReference)的理解与使用