菜鸟笔记
提升您的技术认知

weak_ptr的使用

weak_ptr 是C++11引入的一种智能指针,常常和它的兄弟,同样是C++11引入的shared_ptr配合使用。由于是新东西,一些早期的code未必会有,有时也不让使用。
我个人觉得这个东西早就应该引进了,当然也和C++作为一门有缺陷的语言有关系。下面就看下它的成员函数以及使用场景。

weak_ptr常用成员函数:

weak_ptr<T> w...............声明一个weak_ptr指针w,指向T型对象
weak_ptr<T> w(p)............声明并且初始化,使其值为p
w = p.......................赋值。p一般是shared_ptr或者weak_ptr
w.reset()...................使w指向null
w.use_count()...............所有与weak_ptr指向同一对象的shared_ptr的数量
w.expired().................weak_ptr的生命期,指向对象还存在就返回true
w.lock()....................生命期未结束,则返回一个shared_ptr,指向同样的对象。否则返回一个指向null的shared_ptr
#include<iostream>
#include<memory>

using std::cout; using std::endl;

int main()
{
    //不使用智能指针常常见到的场景:
    int *ptr = new int(10);
    int *ref = ptr;
    delete ptr;    //此时ref就变成了悬空指针       

     //有了智能指针之后,我们可以这样用:
    shared_ptr<int> sptr(new int(10));  //shared初始化
    weak_ptr<int> wptr1 = sptr;   //与shared_ptr指向同一对象
    sptr.reset(new int(20));  //shared_ptr指向新的对象
    weak_ptr<int> wptr2 = sptr;  //用新的weak_ptr

    if(auto tmp = wptr1.lock())  //lock()返回shared_ptr,非空则输出
        cout << *tmp << '\n';
    else
        cout << "expired!" << '\n';

    if(auto tmp = wptr2.lock())  //lock()是weak_ptr成员函数
        cout << *tmp << '\n';
    else
        cout << "expired!" << endl;

    return 0;
}

以上代码weak_ptr用于指向shared_ptr指向的对象。当我们reset了shared_ptr之后,
weak_ptr会自动“到期”(expired),不会产生悬空指针。同时,因为weak_ptr指
向某个对象,并不会使该对象的shared_ptr的use_count()改变,因此weak_ptr用的
比较多的场景就是查看某个shared_ptr指向的对象。