CPP

智能指针 unique_ptr 和 shared_ptr 使用时

2018-12-19  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读