美文网首页
std::shared_ptr之deleter的巧妙应用

std::shared_ptr之deleter的巧妙应用

作者: 43ce3d72fadb | 来源:发表于2018-12-11 15:27 被阅读7次

本文由作者邹启文授权网易云社区发布。


std::shared_ptr

一次创建,多处共享,通过引用计数控制生命周期。 
实例 
在邮箱大师PC版中,我们在实现搜索时,大致思路是这样的: 
每一个账号都有一个SearchFlow,搜索开始后,所有SearchFlow一起并发搜索, 
当全部SearchFlow通过callback返回后,意味着搜索结束。 
方案: 
搜索前,使用std::set<int64_t> accounts记录那些并发搜索的账号, 
当某个账号搜索完成时,在callback中从accounts移除这个账号, 
那么,当accounts为空时,表示整个搜索过程结束。 
问题,假如搜索过程中,某个账号被删除了,其callback不会返回,那么,怎么保证搜索流程全部结束呢? 
std::shared_ptr在这种情况下就派出了用场,而且非常巧妙。

    std::shared_ptr<void> shared_ref_count((void*)0, [](void*){        // end    });    for(int i = 0; i < 5; i++){        auto callback = base::Bind([shared_ref_count](){});        auto flow = new SearchFlow(callback);        flow->Search(key);    }

别忘了,std::shared_ptr的构造函数中提供了一个Deleter,可以让我们自己来释放对象,而我们就在这里执行搜索结束后的代码。 
SearchFlow在执行结束后销毁,或者当账号被删除后直接销毁,那么,保存在callback(注:callback是SearchFlow的成员变量)中的shared_ref_count也会销毁,其引用计数-1,当所有SearchFlow都销毁(正常或非正常)后,shared_ref_count引用计数为0,此时,Deleter就执行了。 
总结 
std::shared_ptr的引用计数原本是其内部为了控制生命周期使用,但是,在这里我们却巧妙的利用引用计数来追踪“散发出去”Flow的踪迹,间接观察Flow的生命周期,从而实现一个源头分散出去,最终归于一点的解决方案。

更多网易技术、产品、运营经验分享请访问网易云社区

相关文章:
【推荐】 一个小白的测试环境docker化之路
【推荐】 测试周期内测试进度报告规范

相关文章

  • std::shared_ptr之deleter的巧妙应用

    本文由作者邹启文授权网易云社区发布。 std::shared_ptr 一次创建,多处共享,通过引用计数控制生命周期...

  • chapter4 解决 内存泄露: 智能指针

    4.1 std::shared_ptr 4.2 std::unique_ptr 独占的 SP 4.3 std::...

  • std::shared_ptr几点说明

    一、原则 使用std::shared_ptr管理具备共享所有权的资源 二、原理 std::shared_ptr是通...

  • 标准库:指针

    5.1 RAII 与引用计数 智能指针包括std::shared_ptr/std::unique_ptr/std:...

  • 再说智能指针

    一 STL的智能指针及使用 STL中智能指针有std::shared_ptr std::weak_ptr std:...

  • tips

    两个常被使用的RAII classes分别是std::tr1::shared_ptr和std::auto_ptr。...

  • std::weak_ptr用法

    一、特性 std::weak_ptr并不是一种独立的智能指针,而是std::shared_ptr的一种扩充。std...

  • std::shared_ptr

    std::shared_ptr 是一种智能指针,它能够记录多少个 shared_ptr 共同指向一个对象,从而消除...

  • 智能指针

    1. share_ptr 使用 必须显示调用 std::shared_ptr ptr(new String("...

  • Chromium中的scoped_refptr

    Chromium中的scoped_refptr类似std::shared_ptr,但用起来稍微复杂一点。scope...

网友评论

      本文标题:std::shared_ptr之deleter的巧妙应用

      本文链接:https://www.haomeiwen.com/subject/awqehqtx.html