weak_ptr是为了配合shared_ptr而引入的一种智能指针,它更像是shared_ptr的一个助手而不是智能指针,因为它不具备普通指针的行为,没有重载operator *和->。它的最大作用就是协作shared_ptr工作,像旁观者那样观测资源的使用情况。
weak_ptr的使用函数
& weak_ptr重载了 & 。
long use_count() //引用计数
bool expired() //是否失效指针
void expired() //重置指针
shared_ptr<T> lock() //获取shared_ptr
void swap(weak_ptr<T> & b); //交换指针
用法:
weak_ptr被设计与shared_ptr协同工作,可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。同样weak_ptr析构时也不会导致引用计数减少,它只是一个静静的观测者。
使用weak_ptr的成员函数use_count()可以观测资源的引用计数,另一个成员函数expired()的功能等价于use_count() == 0;但更快,被表示观测的资源已经不复存在。
#include <boost/smart_ptr.hpp>
#include <iostream>
int main()
{
boost::shared_ptr<int> sp(new int(10)); //一个shared_ptr
assert(sp.use_count() == 1);
boost::weak_ptr<int> wp(sp); //从shared_ptr创建weak_ptr
assert(wp.use_count() == 1); //weak_ptr不影响引用计数
if (!wp.expired()) //判断weak_ptr观察的对象是否失效
{
boost::shared_ptr<int> sp2 = wp.lock();//获得一个shared_ptr
*sp2 = 100;
assert(wp.use_count() == 2);
} //退出作用域,sp2自动析构,引用计数减1
assert(wp.use_count() == 1);
sp.reset(); //shared_ptr失效
assert(wp.expired()); //判断指针是否失效
assert(!wp.lock()); //weak_ptr将获得一个空指针
return 0;
}