美文网首页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

相关文章

  • C++11智能指针

    智能指针 unique_ptr shared_ptr weak_ptr 在C98中,智能指针通过一个模...

  • c++11 智能指针

    智能指针介绍 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, wea...

  • 面试——C++智能指针

    STL中的智能指针:auto_ptr(deprecated),unique_ptr,shared_ptr,weak...

  • 标准库:指针

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

  • 智能指针

    C++ 11 智能指针 unique_ptr、shared_ptr 与 weak_ptr C++ 11 中有 un...

  • 16/3

    1.智能指针类分类 auto_ptr(摒弃不建议使用) unique_ptr shared_ptr 如图三个指针定...

  • 智能指针

    C++里面的智能指针包括auto_ptr, shared_ptr, unique_ptr, weak_ptr四种。...

  • C++11智能指针

    C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其...

  • C++:智能指针使用方法

    0.什么是智能指针? auto_ptr, shared_ptr, weak_ptr, unique_ptr这四个是...

  • C++智能指针作为成员变量

    C++11为我们提供了shared_ptr、unique_ptr和weak_ptr这三种智能指针帮助我们更方便安全...

网友评论

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

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