weak_ptr的作用

weak_ptr的使用

介绍

weak_ptr可以说是shared_ptr的一种扩充,它既不可以提领指针也不可以检查是否为空,一般是通过shared_ptr进行创建,但是不会影响shared_ptr的引用次数。它可以使用下面代码判断指针是否空悬,

std::sheard_ptr<int> a = std::make_shared<int>();
std::weak_ptr<int> b(a);
a = nullptr;
if(b.expired())
    	...

下面的代码,我们可以实现,是否weak_ptr指向的指针是空悬的,来构建shared_ptr指针

/*如果b是空悬的,那么a就是nullptr*/
std::shared_ptr<int> a = b.lock();
/*如果b是空悬的就抛出异常*/
std::shared_ptr<int> c(b)
应用
缓存的使用

我们使用缓存的时候需要先判断缓存是否失效,那么我们就可以使用weak_ptr来存储缓存,然后通过上述的方法获取shared_ptr指针,如果缓存失效那么shared_ptr就会为nullptr,此时我们重新加载缓存,如下代码

std::sheard_ptr<int> fastLoadInt(int id)
{
    static unordered_map<int,std::weak_ptr<const int>> cache;
    auto objPtr = cache[id].lock();
    if(!objPtr)
    {
        objPtr = loadInt(id);
        cache[id] = objPtr//这里有个强转,把shared_ptr转为weak_ptr,不会增加计数的
    }
    return objPtr;
}
观察者模式的使用

观察者模式你们可能不知道,没关系,有时间我会单独出一篇,现在只需知道,观察者模式中的通知者,会存有观察者的一些状态,通知真通过这些状态来通知所有观察者进行一些操作,那么可能会有观察者没有了,那么通知者就不会再去通知已经没有的观察者了,此时我们就可以使用unique_ptr来存观察者的状态,通知前先对齐是否空悬进行判断,如果空悬了,那么直接就不用通知了,使用方法和上面的缓存差不多,这里先不给代码了,等观察者模式再给出代码。

循环引用的避免

shared_ptr是很智能,但是它避免不了循环引用的问题,比如下面的代码,下面的循环引用导致即使两个智能指针的生存期都到了,内部的内存还是不会析构,因为引用计数用不为0,这时候,我们就可以使用weak_ptr来避免,当我们需要循环引用的时候,其中一个采用weak_ptr来引用,这时候就没有计数不为0的情况了。

struct classB;
struct classA
{
    std::shared_ptr<classB> ptr;
}
struct classB
{
    std::shared_ptr<classA> ptr;
    //std::weak_ptr<classA> ptr;
}
classA *a = std::make_shared_ptr<classA>;
classB *b = std::make_shared_ptr<classB>;
a.ptr = b;
b.ptr = a;
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值