《白话C++》第10章 STL和boost,Page91 std::shared_ptr常用功能03

5.  make_shard

使用上智能指针,就可以不用写“delete”这个关键字了,不过“new”这个关键字还的写

...
shared_ptr <Student> p(new Student);
p->foo();
...

这就回造成new和delete之间的对称性被严重破坏

标准库提供了make_shared方法,,可以创建出shared_ptr,不需要字面上的new操作。比如创建一个指向值为99的整数的智能指针:

std::shared_ptr <int> p(new int(99));

使用make_shared之后是:

std::shared_ptr <int> p = std::make_shared <int> (99);

make_shared()是一个函数,因此返回的智能指针可以妥妥地运用转移语义,所以此时在定义p时回到使用“=”进行初始化的传统形式(编译器在这里用了优化手段)。事实上语义是如此的明确,所以也可以配合使用auto关键字的新作用:

auto p = std::make_shared <int> (99);

当然也可以用于自定义的struct/class对象的创建过程,运用模板技术,make_shared支持构造各种自定义对象时,可能的入参个数:

class Coo
{
public:Coo(){}; //0个入参Coo(int a){}; //1个入参Coo(int a, std::string s, bool b){} //3个入参
};void test()
{cout << "make_shared是个模版函数,支持不定个数的入参,内部则调用所要创建的对象的构造函数"",并匹配入参。" << endl;auto p1 = std::make_shared <Coo> ();auto p2 = std::make_shared <Coo> (100);auto p3 = std::make_shared <Coo> (100, "Tom", true);
}

make_shared是个模版函数,支持不定个数的入参,内部则调用所要创建的对象的构造函数,并匹配入参。

如果某个类的构造函数被可以设定为非公开,那make_shared和位于类外的new操作都会失灵,通常改为调用该类设计者提供的其他构建方法。

不是很重要,但也提一下,通常使用make_shared创建shared_ptr,会比先创建裸指针,再创建shared_ptr性能略好。原因在于make_shared明确地表明了操作目的,因此在实现上可以一次性分配裸指针和智能指针本身所需的库存。

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

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

相关文章

沁恒CH32V30X学习笔记08---基本定时器超时功能

TIM 基本定时器 高级定时器模块包含一个功能强大的 16 位自动重装定时器(TIM1、TIM8、TIM9 和 TIM10) 通用定时器模块包含一个 16 位可自动重装的定时器(TIM2、TIM3、TIM4 和 TIM5) 基本定时器模块包含一个 16 位可自动重装的定时器(TIM6 和 TIM7) 定时器的结构大致可…

通过VSCode开发Python项目

一、插件准备 Python 插件&#xff0c;必须 autoDocstring 生成注释&#xff0c;和Pycharm一样输入三个引号"""会生产注释结构 Todo Tree 高亮显示 TODO/FIXME 二、python相关设置 一&#xff09;设置python环境 按"F1"打开命令面板&#xff08;…

在 SQL Server 中编写函数以获取年加周的字符串

在 SQL Server 中&#xff0c;有时候我们需要将日期转换为表示年份和周数的字符串。为了实现这个目标&#xff0c;我们可以编写一个简单的函数。下面是一个示例函数&#xff0c;该函数接受一个日期作为输入&#xff0c;并返回年份和周数的字符串。 CREATE FUNCTION dbo.GetYea…

Python 命令补全工具 argcomplete

1. 概述 在使用Python 命令或者 Python的命令行工具的时候&#xff0c;一个痛点是没有补全。比如python -m后面输入包名字&#xff0c;就没有提示&#xff0c;每次想运行一个http server的时候&#xff0c;都需要搜索一下http服务的包名。另外&#xff0c;像pip&#xff0c;pi…

《Docker极简教程》--Dockerfile--Dockerfile的基本语法

Dockerfile是一种文本文件&#xff0c;用于定义Docker镜像的内容和构建步骤。它包含一系列指令&#xff0c;每个指令代表一个构建步骤&#xff0c;从基础镜像开始&#xff0c;逐步构建出最终的镜像。通过Dockerfile&#xff0c;用户可以精确地描述应用程序运行环境的配置、依赖…

Redis第一关之常规用法

简介 Redis不用多说&#xff0c;已经火了很多年了&#xff0c;也用了很多年了。现在做一些归纳总结。 这篇文章主要介绍Redis的常规知识及用法&#xff0c;包括数据结构、使用场景、特性、过期机制、持久化机制。 Redis与Mysql Mysql是一款基于磁盘的关系型SQL数据库。 Redi…

如何低成本实现商场室内导航地图制作

商场地图导航可提升顾客服务体验&#xff0c;促进商场信息化建设。蜂鸟视图提供两种低成本的商场导航实现方式&#xff0c;以满足不同需求。 一、模拟导航 用户可选用“模拟导航”&#xff1a;将商场CAD图纸导入蜂鸟视图地图编辑器&#xff0c;通过简单操作生成室内3D地图&…

【网络安全 | 网络协议】一文讲清HTTP协议

HTTP概念简述 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;协议&#xff0c;又称超文本传输协议&#xff0c;用于传输文本、图像、音频、视频以及其他多媒体文件。它是Web应用程序通信的基础&#xff0c;通过HTTP协议&#xff0c;Web浏览器可以向Web服务器发起请…

代码随想录算法训练营第三十六天|435. 无重叠区间 763.划分字母区间 56. 合并区间

435. 无重叠区间 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 细节&#xff1a; 1. 这道题目和 452.用最少数量的箭引爆气球 &#xff0c;452中的弓箭数量其实就是 无重叠区间的数量&#xff0c;用总的区间数减去 无重叠区间的数…

kotlin协程学习总结

1.协程是什么&#xff1f; kotlin中的协程是基于协程框架Coroutine实现的轻量级线程&#xff0c;提供一种简化处理异步任务的方式。 2.怎么使用协程&#xff1f; 使用协程框架中的launch方法包裹的代码块就是协程的内容&#xff0c;常规的代码如下&#xff1a; val corouti…

vscode 开发代码片段插件

环境准备 node - 20v版本 &#xff0c;推荐使用nvm进行版本控制全局安装 "yo" 是 Yeoman 工具的命令行工具&#xff0c; npm i yo -g全局安装 generator-code 是一个 Yeoman 脚手架 gernerator-code npm i gernerator-code -g全局安装 npm install -g vsce官方文档 …

使用openai-whisper实现语音转文字

使用openai-whisper实现语音转文字 1 安装依赖 1.1 Windows下安装ffmpeg FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 # ffmpeg官网 https://ffm…

Unity之闪电侠大战蓝毒兽

目录 &#x1f3a8;一、创建地形 &#x1f3ae;二、创建角色 &#x1f3c3;2.1 动画 &#x1f3c3;2.2 拖尾 &#x1f3c3;2.3 角色控制 ​&#x1f3c3;2.4 技能释放 &#x1f3c3;2.5 准星 &#x1f4f1;三、创建敌人 &#x1f432;3.1 选择模型 &#x1f432;3.…

Netty Review - NIO空轮询及Netty的解决方案源码分析

文章目录 Pre问题说明NIO CodeNetty是如何解决的&#xff1f;源码分析入口源码分析selectCntselectRebuildSelector Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketChannel源码分析 Netty Review - 服务端channel注册流程源码解析 问题说明 N…

专题十一、指针和数组

指针和数组 1. 指针的算术运算1.1 指针加上整数1.2 指针减去整数1.3 两个指针相减1.4 指针比较1.5 指向复合常量的指针 2. 指针用于数组处理3. 用数组名作为指针3.1 数组型实际参数&#xff08;改进版&#xff09;3.2 用指针作为数组名 4. 指针和多维数组4.1 处理多维数组的元素…

log4j2的使用

基础用法 1. pom文件导入依赖 junit用来做测试 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.5</version></dependency><dependency><groupId>org.…

国际网络专线多少钱一年

国际网络专线作为企业扩展业务的重要通信渠道&#xff0c;已经成为许多企业不可或缺的选择。然而&#xff0c;对 于许多企业来说&#xff0c;选择一条稳定、高质量的国际网络专线&#xff0c;并不是一件容易的事情。那么&#xff0c;国际 网络专线到底多少钱一年呢&#xff1f;…

每日一题 KY188 哈夫曼树

哈夫曼树&#xff0c;第一行输入一个数n&#xff0c;表示叶结点的个数。需要用这些叶结点生成哈夫曼树&#xff0c;根据哈夫曼树的概念&#xff0c;这些结点有权值&#xff0c;即weight&#xff0c;题目需要输出所有结点的值与权值的乘积之和的最小值。 输入描述: 输入有多组…

BGP 邻居建立

拓扑图 配置 BGP进程号及为AS号 使用环回口建立BGP邻居关系时&#xff0c;需要指定更新源地址 EBGP在使用环回口建立邻居关系时&#xff0c;需配置EBGP多跳&#xff0c;环回口路由可达 EBGP的路由器存在IBGP邻居时&#xff0c;需要配置next-hop-local&#xff0c;保证下一跳…

如何使用 ChatGPT 指令大全

你是否常常看到网路上分享的 ChatGPT 案例,但自己用了后收到的答覆并没有太大帮助?之所以会这样,是因为指令给的不够精确与到位。要让 ChatGPT 发挥最大效用,你需要好的指令。如果你不知道如何给出好的指令,不用担心,让 ChatGPT 指令大全来帮助你 😀 下 ChatGPT 指令…