weak_ptr被设计为shared_ptr的助手,可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权,但是weak_ptr没有去共享资源,它的构造不会引起指针引用计数的增加,同样,weak_ptr析构也不会引起指针引用计数的减少
weak_ptr没有重载operator*和operator->,这是特意的。但是可以使用一个非常重要的成员函数lock(),从被观测的shared_ptr获得一个可用的shared_ptr对象,从而操作资源.当expired() == true的时候,lock()函数将返回一个存储空指针的shared_ptr() 下面举个例子:
shared_ptr<int> sp(new int(10));
assert(sp.use_count() == 1);
weak_ptr<int> wp(sp); //从shared_ptr创建weak_ptr
assert(wp.use_count() == 1); //weak_ptr不影响引用计数
if (!wp.expired()) //判断weak_ptr观察的对象shared_ptr是否失效
{
shared_ptr<int> sp2 = wp.lock(); //获得一个shared_ptr
*sp2 = 100;
assert(wp.user_count() == 2)
} //退出作用于,sp2自动析构,引用计数减1
assert(wp.sue_count() == 1);
sp.reset(); // shared_ptr失效
assert(wp.expired());
assert(!wp.lock()); //weak_ptr将获得一个空指针