美文网首页CPP
智能指针 unique_ptr 和 shared_ptr 使用时

智能指针 unique_ptr 和 shared_ptr 使用时

作者: 顽强的猫尾草 | 来源:发表于2018-12-19 19:35 被阅读2次

    某次面试被问到为什么在项目里使用过 shared_ptr,但是没用过 unique_ptr,被问住了以后决定小小总结一下独占式 unique_ptr 和共享式 shared_ptr 这两个智能指针的区别和使用场景。

    区别
    我们都知道 unique_ptr 是独占所指向对象的,也就是说某个时刻只能有一个 unique_ptr 指向一个给定对象。如果这个对象需要在多个指针之间分享,可以把它转变成 shared_ptr。如果是 unique_ptr,当它被销毁时它所指向的对象也被销毁。但 shared_ptr 会维护一个引用计数(use_count),只有最后一个 shared_ptr 也被销毁时,这个对象才真的被销毁。

    使用场景
    尽管 shared_ptr 功能强大,但不是任何时候都有必要使用 shared_ptr。当你不确定使用的指针是不是被分享所有权的时候,默认选 unique_ptr 独占式所有权,因为 unique_ptr 效率比 shared_ptr 高,不需要维护引用计数和背后的控制块。当确定要被分享的时候可以转换成 shared_ptr。

    另外其实不是说两个指针分享同一个变量就需要用 shared_ptr,尤其是不涉及到多线程的程序中,不使用智能指针也没关系。

    有必要使用 shared_ptr 的场景举例:

    ----------------------------------------
    |               Thread 1               |
    | ------------------------------------ |
    | void func(shared_ptr<int> p) { ... } |
    ----------------------------------------
    
    -------------------------------------------
    |              Main Thread                |
    | --------------------------------------- |
    | shared_ptr<int> p = make_shared<int>(); |
    | func(p);                                |
    -------------------------------------------
    

    主线程开启子线程并在其中执行 func 函数,如果不使用智能指针 shared_ptr,当主线程执行完自行释放普通指针 p,此时子线程的函数还没执行完,p 就已经失效了,造成程序崩溃。而使用 shared_ptr 只会在主线程结束时自动将 use_count 减一,不影响子线程的使用。

    更详细的智能指针介绍:智能指针及其作用

    参考文献:
    [1] shared_ptr 和 unique_ptr 区别和联系
    [2] 智能指针:shared_ptr 和 unique_ptr,优先使用 unique_ptr

    相关文章

      网友评论

        本文标题:智能指针 unique_ptr 和 shared_ptr 使用时

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