C++中的智能指针

在这里插入图片描述
智能指针是在 C + + 14 C++14 C++14中新引入的,所以在编译的时候最好加入 " − s t d = c + + 14 " "-std=c++14" "std=c++14"的编译选项。智能指针一共有两种,分别是 u n i q u e _ p t r unique\_ptr unique_ptr s h a r e d _ p t r shared\_ptr shared_ptr

u n i q u e _ p t r unique\_ptr unique_ptr

u n i q u e _ p t r unique\_ptr unique_ptr可以使用 m a k e _ u n i q u e make\_unique make_unique来生成:

  template<typename _Tp, typename... _Args>inline typename _MakeUniq<_Tp>::__single_objectmake_unique(_Args&&... __args){ return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }

可以看出 m a k e _ u n i q u e make\_unique make_unique是一个模板函数,将返回一个 _ T p \_Tp _Tp类型的指针,也就是假设有一个 p o i n t point point类:

struct point
{int x, y;point(int x, int y){this->x = x;this->y = y;}
};

然后声明一个指针:

std::unique_ptr<point> x = make_unique<point>(3, 5);

x x x为一个指向 p o i n t ( 3 , 5 ) point(3,5) point(3,5)的指针,然而由于其" u n q i u e unqiue unqiue"的特性, x x x不可被拷贝构造以及拷贝赋值,在源码里,其拷贝构造以及拷贝赋值被定义成以下的形式:

unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;

C + + C++ C++中,“ = d e l e t e = delete =delete"是一种特殊的函数声明方式,用于禁用或删除某个函数的默认实现。当一个函数被声明为” = d e l e t e = delete =delete"时,编译器将不会生成该函数的默认实现,并且在尝试调用该函数时会引发编译错误。
然而,有的时候需要将 x x x指向的内存转给其他指针,那么这个时候,只有唯一的一种方法,就是:

auto y = std::move(x);
//or std::unique_ptr<point> y = std::move(x);

s h a r e d _ p t r shared\_ptr shared_ptr

s h a r e d _ p t r shared\_ptr shared_ptr不同于 u n i q u e _ p t r unique\_ptr unique_ptr,其可以通过拷贝赋值给其他指针,以下分别是其拷贝构造以及拷贝赋值函数。

shared_ptr& operator=(const shared_ptr& _Right) noexcept{	// assign shared ownership of resource owned by _Rightshared_ptr(_Right).swap(*this);return (*this);}
shared_ptr(const shared_ptr& _Other) noexcept{	// construct shared_ptr object that owns same resource as _Otherthis->_Copy_construct_from(_Other);}

也就是说, s h a r e d _ p t r shared\_ptr shared_ptr可以通过以下方式构造:

std::shared_ptr<point> x = make_shared<point>(3, 5);
auto y = x;
auto z(x);

同时可以通过 u s e _ c o u n t use\_count use_count方法统计一块相同的内存被几个指针共享:

cout << x.use_count() << endl;

共享指针有以下几个 t r i c k trick trick

  1. 当共享指针被拷贝构造或者拷贝赋值的时候,指向的内存才算被共享了一次,所以上面的那段代码输出的结果为 3 3 3,然而如果是进行浅拷贝的话,不算做一次共享:
auto y = std::move(x);
cout<<y.use_count()<<x.use_count<<endl;
//该结果为3 0
  1. 如果是传入函数并且打印 u s e _ c o u n t use\_count use_count,也有以下两种情况。
void func(std::shared_ptr<point> x)
{cout << x.use_count() << endl;
}
int main(void)
{std::shared_ptr<point> x = make_shared<point>(3, 5);auto y = x;auto z(x);cout << x.use_count() << endl;func(std::move(x));//这个右值引用如果给一个左值里面就空了cout << x.use_count() << endl;
}
//本结果为
//3 3 0
//如果调用x的其他属性会报段错误。
void func(std::shared_ptr<point>&& x)
{cout << x.use_count() << endl;
}
int main(void)
{std::shared_ptr<point> x = make_shared<point>(3, 5);auto y = x;auto z(x);cout << x.use_count() << endl;func(std::move(x));//这个右值引用如果给一个左值里面就空了cout << x.use_count() << endl;
}
//这个结果为3 3 3

如果不按右值引用传入:

void func(std::shared_ptr<point> x)
{cout << x.use_count() << endl;
}
int main(void)
{std::shared_ptr<point> x = make_shared<point>(3, 5);auto y = x;auto z(x);cout << x.use_count() << endl;func(x);//这个右值引用如果给一个左值里面就空了cout << x.use_count() << endl;
}
//这个结果是3 4 3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/162000.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

试着写几个opencv的程序

一、认识opencv OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉库&#xff0c;旨在提供丰富的图像处理和计算机视觉功能&#xff0c;以帮助开发者构建视觉应用程序。OpenCV最初由英特尔开发&#xff0c;现在由社区维护和支持。它支持…

【UE4 反射系统】 UCLAS UFUNCTION UPROPERTY 宏简单解析 持续更新

目录 0 引言1 C如何实现反射机制1.1 使用代码生成工具实现反射机制 2 UE4的反射系统2.1 ****.generated.h头文件2.2 GENERATED_BODY()2.3 反射宏 UCLASS 等2.4 UHT和UBT 3 基本宏的使用3.1 UCLASS3.2 UFUNCTION3.3 UPROPERTY &#x1f64b;‍♂️ 作者&#xff1a;海码007&…

Axure RP医疗在线挂号问诊原型图医院APP原形模板

医疗在线挂号问诊Axure RP原型图医院APP原形模板&#xff0c;是一款原创的医疗类APP&#xff0c;设计尺寸采用iPhone13&#xff08;375*812px&#xff09;&#xff0c;原型图上加入了仿真手机壳&#xff0c;使得预览效果更加逼真。 本套原型图主要功能有医疗常识科普、医院挂号…

美创科技信创数据安全「利基者」!

近日&#xff0c;第一新声研究部正式发布《2023年中国信创网络安全产品竞争力象限》&#xff08;下称“象限报告“&#xff09;。 ◼︎ 象限报告综合考虑企业占有率、在技术/应用上的成熟度、在客户方面的交付完成度及口碑、产品在市场/营销/商业模式/行业拓展等战略上的领先性…

解决Drag and drop is not supported导致无法将物理机上的文件拖入Ubuntu

问题起因 因为需要拷贝一个文件从物理机到虚拟机&#xff0c;但是我又不想用有关ftp的程序或者协议&#xff0c;但是直接拖又报错Drag and drop is not supported&#xff0c;索性上网查询了一下解决方法&#xff0c;自己记录一下。 解决方法 安装下面两个程序 sudo apt in…

python小游戏:小球碰撞

创建带图形界面的游戏通常需要使用图形库。Python有很多图形库&#xff0c;其中比较流行的包括Pygame, PyOpenGL, Panda3D等。在这里&#xff0c;我将用Pygame作为示例来编写一个简单的游戏。 在运行下面的代码之前&#xff0c;请确保你已经安装了Pygame库。你可以使用以下命令…

工控机连接Profinet转Modbus RTU网关与水泵变频器Modbus通讯配置案例

Profinet转Modbus RTU网关是一个具有高性能的通信设备&#xff0c;它能够将工控机上的Profinet协议转换成水泵变频器可识别的Modbus RTU协议&#xff0c;实现二者之间的通信。通过这种方式&#xff0c;工控机可以直接控制水泵变频器的运行状态&#xff0c;改变其工作频率&#…

美格智能SLM927智能模组,轻松打造功能丰富的智能终端

近年来&#xff0c;智能终端加速渗入各行各业&#xff0c;使用场景不断拓展&#xff0c;视觉、听觉、语音、传感等交互能力融入智能终端产品之中&#xff0c;带来涵盖工作和生活各场景的智能化浪潮。 美格智能作为全球领先的无线通信模组及解决方案提供商&#xff0c;深入洞察…

Linux网络编程系列之UDP组播

Linux网络编程系列 &#xff08;够吃&#xff0c;管饱&#xff09; 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

Linux网络-UDP/TCP协议详解

Linux网络-UDP/TCP协议详解 2023/10/17 14:32:49 Linux网络-UDP/TCP协议详解 零、前言一、UDP协议二、TCP协议 1、应答机制2、序号机制3、超时重传机制4、连接管理机制 三次握手四次挥手5、理解CLOSE_WAIT状态6、理解TIME_WAIT状态7、流量控制8、滑动窗口 丢包问题9、拥塞控制…

【Qt-19】按Q退出应用程序

如何将Qt窗口应用程序改成控制台程序呢&#xff1f; 下面进入正文&#xff0c;如何控制控制台程序退出呢&#xff1f; 这里采用线程方式&#xff0c;通过单独线程监视用户输入来执行是否退出程序。 监视线程头文件thread.h #include <QThread> #include "TDRServe…

【ARM裸机】ARM入门

1.ARM成长史 2.ARM的商业模式和生态系统 ARM只设计CPU&#xff0c;但是不生产CPU 3.为什么使用三星&#xff1a;S5PV210 4.各种版本号 0. ARM和Cortex Cortex就是ARM公司一个系列处理器的名称。比如英特尔旗下处理器有酷睿&#xff0c;奔腾&#xff0c;赛扬。ARM在最初的处理器…

[BX]和Loop指令

[BX]和Loop指令 1 描述性符号: “()”2 idata常量3 [BX]4 Loop5 Debug和汇编编译器masm对指令的不同处理6 Loop和[BX]的联合应用7 段前缀 本文属于《 X86指令基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 描述性符号: “()” 我们定义的描述性的符号: "()”&…

【web前端】web前端设计入门到实战第一弹——html基础精华

前端 一&#xff1a;图片属性二&#xff1a;音频标签三&#xff1a; 视频标签四&#xff1a;链接标签五&#xff1a;列表标签5.1.无序列表5.2.有序列表3.自定义列表 六&#xff1a;表格6.1合并单元格 七&#xff1a;input标签八&#xff1a;select系列九&#xff1a; 文本域标签…

python元组、拆包和装包

注意 元组不能修改元素 元组&#xff1a;如果元素为字符串且元素为1个&#xff0c;必须加一个&#xff0c; ********* t1 (aa,) 下标和切片 in not in for ... in ... 元组转为列表 拆包、装包

Android DI框架-Hilt

到底该如何理解<依赖注入> 模版代码&#xff1a;食之无味&#xff0c;弃之可惜 public class MainActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView mTextView(TextView) findVi…

游戏数据分析工具该怎样选择?有哪些选择标准?

选择游戏数据分析工具时&#xff0c;可以考虑以下标准&#xff1a; 1、功能全面性 确保工具提供全面的功能&#xff0c;包括玩家行为分析、性能监测、用户留存率、收入分析等&#xff0c;以满足不同层面的需求。 2、易用性 选择界面友好、易于使用的工具&#xff0c;以确保团…

[PyTorch]即插即用的热力图生成

先上张效果图&#xff0c;本来打算移植霹雳老师的使用Pytorch实现Grad-CAM并绘制热力图。但是看了下代码&#xff0c;需要骨干网络按照标准写法&#xff08;即将特征层封装为features数组&#xff09;&#xff0c;而我写的网络图省事并没有进行封装&#xff0c;改造网络的代价又…

【学习笔记】RabbitMQ-6 消息的可靠性投递2

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 十一、队列Queue的消息属性11.1 具体属性11.2 自动删除11.2 自定义参数11.2.1 **Message TTL** 消息存活时间11.2.2 **Auto expire** 队列自动到期时间11.2.3 **Overflow behaviour** 溢出行为11.2.4…

微信扫码跳转到小程序内部,浏览器扫码跳转到App 内部,如果手机上没有安装App ,跳转到下载页

第一:微信扫普通二维码跳转到小程序 第一步:登录微信公众平台,左侧点击开发管理,点击开发设置,滑到最下边,找到扫普通链接二维码打开小程序,配置对应的二维码链接,注意要拿这个链接去生成二维码,这样微信扫码才能跳转到小程序内部,还有那个校验文件,让后台放到对应的文件夹下,…