weak_ptr 是c 11引入的一种智能指针,常常和它的兄弟,同样是c 11引入的shared_ptr配合使用。由于是新东西,一些早期的code未必会有,有时也不让使用。
我个人觉得这个东西早就应该引进了,当然也和c 作为一门有缺陷的语言有关系。下面就看下它的成员函数以及使用场景。
weak_ptr常用成员函数:
weak_ptr w...............声明一个weak_ptr指针w,指向t型对象
weak_ptr 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
#include
using std::cout; using std::endl;
int main()
{
//不使用智能指针常常见到的场景:
int *ptr = new int(10);
int *ref = ptr;
delete ptr; //此时ref就变成了悬空指针
//有了智能指针之后,我们可以这样用:
shared_ptr sptr(new int(10)); //shared初始化
weak_ptr wptr1 = sptr; //与shared_ptr指向同一对象
sptr.reset(new int(20)); //shared_ptr指向新的对象
weak_ptr 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指向的对象。