服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 关于C++智能指针shared_ptr和unique_ptr能否互转问题

关于C++智能指针shared_ptr和unique_ptr能否互转问题

2022-12-01 14:18yanjunz C/C++

C++中的智能指针最常用的是shared_ptr和unique_ptr,C++新手最常问的问题是我从一个函数中拿到unique_ptr,但要转成shared_ptr才能使用,要怎么转换?同理是否能将shared_ptr转换成unique_ptr,面对这些问题,跟随小编一起看看吧

关于C++智能指针shared_ptr和unique_ptr能否互转问题

C++中的智能指针最常用的是shared_ptr和unique_ptr,C++新手最常问的问题是我从一个函数中拿到unique_ptr,但要转成shared_ptr才能使用,要怎么转换?同理是否能将shared_ptr转换成unique_ptr?

我们先简单看看shared_ptr是什么。

?
1
std::shared_ptr<Widget> a = std::make_shared<Widget>();

这句代码会在栈中创建一个shared_ptr对象,其最基本的2个指针,一个指向在堆中创建的Widget对象,一个指向一个引用计数,方便后续记录有多少个shared_ptr引用了该Widget对象。

关于C++智能指针shared_ptr和unique_ptr能否互转问题

?
1
2
std::shared_ptr<Widget> a = std::make_shared<Widget>();
std::shared_ptr<Widget> b = a;

当指向了b = a的赋值语句后,内存的状态如下,也就是大家一起维护着Widget对象和引用计数,C++11对count还没有线程安全保护,新版C++对这块已经做了支持,这也意味着性能会有所下降。

关于C++智能指针shared_ptr和unique_ptr能否互转问题

unique_ptr的实现则要简单很多,他内部只维护了一个Ptr指针指向堆中的对象,并且不支持赋值等操作,只支持移动语义,也就是说有且只有一个指针能执行Widget

?
1
2
std::unique_ptr<Widget> a = std::make_unique<Widget>();
std::unique_ptr<Widget> b = std::move(a);

那我们看看相互转换的问题:

Q: unique_ptr转换成shared_ptr?

由于unique_ptr的语义是唯一拥有ownership,那只要对他执行move操作就能把ownership转移出去给shared_ptr

?
1
2
std::unique_ptr<Widget> a = std::make_unique<Widget>();
std::shared_ptr<Widget> b = std::move(a);

这样a就等价于nullptr,而b则指向了堆中的Widget对象,切count=1。

Q:shared_ptr转换成unique_ptr?

由于shared_ptr本质上是多人拥有ownership,所以要转换成语义更加严格的单人拥有ownership是做不到的,就像图2中a和b都指向了同一个对象,这种情况如果要转成一个unique_ptr c的话就需要同时清除掉a和b对于Widget的指向,这是很难做到的,所以标准里面不支持shared_ptr转成unique_ptr。

一句话总结这个原则,严格条件的ownership能转成宽松条件的ownership。

到此这篇关于如何理解shared_ptr和unique_ptr能否互转的文章就介绍到这了,更多相关hared_ptr和unique_ptr互转内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7096514898800148488

延伸 · 阅读

精彩推荐
  • C/C++C++实现加减乘除计算器

    C++实现加减乘除计算器

    这篇文章主要为大家详细介绍了C++实现加减乘除计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    多壹7732022-09-07
  • C/C++浅谈返回函数内部new分配的内存的引用

    浅谈返回函数内部new分配的内存的引用

    下面小编就为大家带来一篇浅谈返回函数内部new分配的内存的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C语言教程网4382021-04-23
  • C/C++C++ 中时间与时间戳的转换实例详解

    C++ 中时间与时间戳的转换实例详解

    这篇文章主要介绍了C++ 中时间与时间戳的转换实例详解的相关资料,需要的朋友可以参考下...

    菁欣6372021-05-17
  • C/C++C++编写简易的飞机大战

    C++编写简易的飞机大战

    一款自己设计的飞机小游戏,本程序于运行环境WINDOWS XP系统,采用C++语言编写。游戏具有得分排名榜,而且在游戏完成后可以提交得分到网络上的世界排名...

    Z_Bin11282021-03-05
  • C/C++C语言超详细讲解指针与结构体

    C语言超详细讲解指针与结构体

    指针提供了对地址操作的一种方法,因此,使用指针可使得C语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作数组。C数...

    野猪佩奇`10972022-11-23
  • C/C++C++数据结构之实现邻接表

    C++数据结构之实现邻接表

    这篇文章主要为大家详细介绍了C++数据结构之实现邻接表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    碣石观海12082021-09-02
  • C/C++详解C/C++内存区域划分(简而易懂)

    详解C/C++内存区域划分(简而易懂)

    C/C++中,内存主要分为、堆、栈、全局/静态存储区和常量存储区。本文重点给大家介绍C/C++内存区域划分的相关知识,需要的朋友参考下吧...

    小一!4022021-11-18
  • C/C++C++中 STL list详解及简单实例

    C++中 STL list详解及简单实例

    这篇文章主要介绍了C++中 STL list详解及简单实例的相关资料,需要的朋友可以参考下...

    hello_hwc5722021-05-07