关于 make_unique 和 make_shared

2023-05-16

C++14 才加入make_unique , 据说当时忘记实现了。 那么C++11 可以自己实现这个功能:

 template<typename T, typename... Args>
    std::unique_ptr<T> make_unique(Args&&... args)
    {
      return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
    }

关于这个函数,有几点要提的:

1.关于template<typename T, typename...  Args>

        这里面提到 typename ...    ||。详情可以看:https://zh.cppreference.com/w/cpp/language/parameter_pack

总结一下:

模板参数包是接受零个或多个模板参数(非类型、类型或模板)的模板参数。函数参数包是接受零个或多个函数参数的函数参数。具有至少一个参数包的模板称为可变参数模板

2. 为什么需要实现make_unique(参照 effective modern c++ 第21条),make系列有一些好处。

        除了填补make_shared 已经实现了,便于使用外。 还有如下原因:

        a.避免重复的冗余,因为new 版本书写了两次类型(Widget),源代码中的重复会导致目标代码笼肿。

        b. 避免有可能发生的内存泄漏。

        c. 使用make系列,可以让编译器有机会优化出更小更快的代码。

如下:

//1.new版本和 make_unique 版本
std::unique_ptr<Widget> ptr2(new Widget);

std::unique_ptr<Widget> ptr1(make_unique<Widget>());

//2. 使用new版本在函数调用中可能存在的问题。

  void processWidget(std::shared_ptr<Widget> spw, int priority);//声明
  void processWidget(std::shared_ptr<Widget> (new Widget), computePriority());//new 调用
/*函数的参数调用顺序是不确定的。倘若调用顺序如:
1.Widget tmpW = new Widget 
2.computerPriority() 
3.share_ptr<widget> tmpPtr = tmp;
假设在函数执行到computerPriority()时,异常 那么则会出现内存泄漏。
因为,tmpW并没有让share_ptr接管到, 这种错误是很隐晦的。*/

 3 .补充第二点,有些情况是不能使用make系列的。

        1) 当需要用到自定义析构函数时,如:

std::shared_ptr<Widget> spw(new Widget,widgetDeleter);

        2)当想使用std::initializer_list 型别的形参来重载构造函数,如:

auto initList={10,20};
auto spv=std::make_shared<std::vector<int>>(initList);

4.对于std::shared_ptr ,不建议使用make系列函数的额外场景包括(比较少的情况):

        a) 自定义内存管理类

        b) 内存紧张的系统,非常大的对象,以及存在比指涩到相同对象的std::shared_ptr生存期更久 的std::weak_ptr;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 make_unique 和 make_shared 的相关文章

  • swift hashable 协议哈希函数是否需要返回唯一值?

    我正在学习 iOS swift 俄罗斯方块教程 并已完成并运行 但我对一个特定的方面感到困惑 Hashable 协议 功能 class Block Hashable Printable var hashValue Int return se
  • JavaScript 唯一浏览器 ID

    有没有办法在javascript中为浏览器创建一个唯一的ID 我说的不是每次生成时都是随机的 ID 而是生成该 ID 的浏览器所特有的 ID 而且还考虑了运行该 ID 的计算机 Example Windows 7 Chrome 可能会生成
  • 具有唯一约束的 Postgres 哈希索引

    由于 Postgres 10 正确支持哈希索引 我想使用哈希索引进行 id 查找 与 btree 相比 哈希索引的大小更小 理论上更快 我有一张桌子 create table t id int create unique index on
  • 如果不存在相同的整行,MySQL INSERT

    我有一个包含 10 列的表 我必须从 CSV 文件添加很多很多行 当然 我不能添加两个相同的行 因此我需要一个 SQL 语句 如果整行确实存在 则忽略该命令 仅当所有字段都相同时才必须忽略 INSERT 两行可能有相同的field1 or
  • Excel - 计算与 ID 匹配的唯一值,针对 100,000 多个案例进行了优化

    参考下面的 Excel 屏幕截图 我正在寻找一个公式解决方案 用于计算 A 列中每个 ID 号的 B 列 颜色 中唯一值的数量 我已将所需结果归入 C 列 因此 例如 ID 1 A2 只有一种唯一颜色 灰色 B2 这将在 C2 中返回 1
  • 有效筛选唯一值的数据 (Python)

    我有一个由 X Y Z A 值组成的 2D Numpy 数组 其中 X Y Z 是 3D 空间中的笛卡尔坐标 A 是该位置的某个值 举个例子 X Y Z A 13 7 21 1 5 9 2 7 0 5 15 3 9 1 1 13 7 21
  • 容器中的共享库

    对于两个进程A和B 都使用库libc so libc so只加载到内存一次 当 A 和 B 都运行在同一主机和同一 rootfs 上时 这是正常情况 对于容器来说 如果A和B运行在不同的容器中 A和B是否共享相同的内存区域 例如 image
  • 测试所有对象是否具有相同的成员值

    我有一个简单的课程python questions tagged python class simple object def init self theType someNum self theType theType self some
  • 如何在 Google Cloud Firestore 中强制文档字段属性的唯一性

    我有以下数据 如图所示 我想确保用户名字段是唯一的 我怎样才能强制执行呢 请记住 我的文档 ID 已经是唯一的 我不想使用我的用户名作为文档 ID 无法在 Firestore 中强制执行字段的唯一值 您可以保证的唯一唯一性是集合中的文档 I
  • 仅从列表中检索非重复元素

    从 Python 列表中仅检索非重复元素的最佳选项是什么 假设我有以下列表 lst 1 2 3 2 3 4 我想检索以下内容 lst 1 4 2 and 3在该列表中不是唯一的 因此不会检索到它们 Use collections Count
  • 通过 EWS 和 C# 访问没有邮箱的资源日历

    我们的 Exchange 管理员 Exchange 2010 SP1 设置了共享资源日历 没有分配给该资源日历的邮箱 我希望能够使用 EWS 和 C 阅读会议 Snippet ExchangeService esvc new Exchang
  • postgresql 分区上的唯一索引

    我有一个名为 cdrs 的表 CREATE TABLE cdrs i cdr bigint NOT NULL i cdrs connection bigint NOT NULL i call bigint NOT NULL customer
  • SQL聚合函数选择唯一值

    我有一个包含两列的行集 technical id and natural id 行集实际上是复杂查询的结果 假设列值之间的映射是双射的 即对于具有相同值的两行 technical id the natural ids 也相同 对于不同的te
  • 在共享主机上从 HTML 页面生成 PDF 文件

    我在主机上启用扩展等的权限非常有限 但我希望通过 PHP 从 HTML 页面 带有 css 图像 生成 PDF 我有什么想法可以通过近乎零的 CL 访问等来实现这一点吗 最好不是 黑客 依赖服务 因为我将寻求长期使用 生成要呈现到 PDF
  • 在 SQL 数据库中保持 RSS 提要唯一的最佳实践

    我正在开发一个项目 该项目显示来自不同站点的 RSS 提要 我将它们保存在数据库中 我的程序每 3 小时获取一次并将它们插入到 SQL 数据库中 我希望提供者有独特的记录 不要显示重复的内容 但问题是一些提供商不提供 GUID 字段 而其他
  • 在 C++ 中检查向量的所有元素是否相等

    如果我有一个值向量并且想要检查它们是否都相同 那么在 C 中有效执行此操作的最佳方法是什么 如果我用其他语言 例如 R 进行编程 我的想法是仅返回容器的唯一元素 然后如果唯一元素的长度大于 1 我知道所有元素不可能相同 在 C 中 可以这样
  • Rails,为什么连接返回具有非唯一值的数组?

    我使用 Rails 3 为例 但我相信 Rails 2 3 也是如此 假设 我有一个有很多位置的模型城市 我尝试寻找有地点的城市 我使用以下代码 City joins locations 但输出数组是 gt
  • Postgresql 强制执行唯一的双向列组合

    我正在尝试创建一个表 该表将在两个方向上强制执行相同类型的两列的唯一组合 例如 这是非法的 col1 col2 1 2 2 1 我已经想出了这个 但它不起作用 database gt d friend Table public friend
  • postgresql 登录到另一个表时发生冲突

    我正在使用 PostgreSQL 9 5 并尝试使用批量插入每天插入数百万行 INSERT INTO tours as cst adults country id price VALUES 3 129 80 2 119 120 on con
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v

随机推荐

  • ROS+python控制小乌龟走方形的实现rospy

    常见的简陋的控制乌龟行走方形的方式很简单 xff0c 例如 xff1a 代码有些地方是测试用的 xff0c 可以不要 usr bin env python from pickle import TRUE import rospy from
  • C++ STL算法

    C 43 43 STL算法 1 非修正序列算法1 1 adjacent find first last 1 2 count first last val 2 修正序列算法2 1 random shuffle first last 2 2 p
  • git子模块的修改和更新操作

    Reference git子模块的修改和更新操作 1 子库与父库 git关于子模块的官方文档链接 xff1a https git scm com book zh v2 Git E5 B7 A5 E5 85 B7 E5 AD 90 E6 A8
  • CMakeLists Option使用简介

    CMakeLists Option使用简介 1 基本格式2 示例3 基本用法4 C程序条件编译5 次项目之间选项的关系 Reference xff1a CMake之Option使用简介 CMake中的option用于控制编译流程 xff0c
  • 四轴一键起飞定高定点悬停伪代码

    四轴飞行器一键起飞定高 xff0c 降落 xff0c 光流定点悬停控制算法伪代码 基于飞控系统的二次开发
  • 开源飞控地面站 Openpilot GCS (现在的Librepilot GCS)源码分析  (2)地图插件

    xff08 xff11 xff09 OpenPilot项目中有地图显示模块 xff08 xff12 xff09 地图显示模块的插件是 xff1a opmap插件 xff0c 位置是src gt plugins gt opmap xff08
  • ubuntu 下运行程序报错 对‘std::cout’未定义的引用:gcc与g++的区别

    目录 1 问题提出 2 gcc与g 43 43 的区别 2 1 预处理 2 2 编译 2 3 汇编 2 4 链接运行 3 总结 1 问题提出 linux初学 xff0c 写了个例程 xff0c 用gcc o编译时出现以下问题 xff1a 后
  • 2.2 开启调度器

    开启调度器 void vTaskStartScheduler void BaseType t xReturn if configSUPPORT STATIC ALLOCATION 61 61 1 静态创建空闲任务 StaticTask t
  • 4. 消息队列

    消息队列 队列又称消息队列 xff0c 常用于任务间通信的数据结构 xff0c 可以在任务与任务之间 xff0c 中断与任务之间传递消息 xff0c 实现任务接收来自其他任务或中断的不固定长度的消息 任务可从消息队列中读取消消息 xff0c
  • 网卡接口

    网络接口 网络接口 xff08 以太网 xff09 是硬件接口 xff0c LwIP是软件 xff0c 并且网卡也是由很多种的 LwIP使用一个数据结构 xff0c nitif来描述网卡 用户提供最底层的接口函数 xff0c LwIP则提供
  • 系统扇区

    系统结构 DBR xff0c 主引导记录 xff1b DPT xff0c 分区表 xff1b DBR xff0c 分区引导扇区 引导扇区 MBR Main Boot Record xff0c 主引导扇区 xff0c 硬盘主引导记录区 xff
  • 华为3COM交换机配置命令详解

    1 配置文件相关命令 Quidway display current configuration 显示当前生效的配置 Quidway display saved configuration xff1b 显示flash中配置文件 xff0c
  • 分区结构

    分区结构 DBR xff0c 引导记录区 xff0c 包括一个引导程序和一个BPB xff0c 即本分区参数记录表 系统可直接访问的第一个扇区 xff0c 大小为512个字节 xff08 特殊情况占用其他保留扇区 xff09 512字节中
  • 1. 列表和列表项

    列表和列表项 列表 列表是一个数据结构 xff0c 用来追踪任务 xff0c 列表中有一个指针指向列表项 列表是一个结构体 xff0c 内部携带一个指针 xff0c 指针指向列表项 xff0c 列表项形成双向链式结构挂载在列表下 一个列表下
  • C#简单串口调试助手【傻瓜教程】chanson_chapter01

    简易串口调试助手制作教程 C Winform chanson chapter01 说明 xff1a 本教程基于win10 x64 位操作系统 xff0c 软件环境为Microsoft Visual Studio Community 2015
  • 快速上手Ubuntu之安装篇——安装win7,Ubuntu16.04双系统

    Linux可以说是开发者的系统 xff0c 对于开发者来说 xff0c Linux发行版不仅为我们提供了无数强大的开发工具 xff0c 还能帮助我们从源码上学习操作系统是工作的 而且经常在命令行上工作的我们还能在别人面前耍下酷 Ubuntu
  • SpringBoot中事件的使用

    项目中很多场景可以使用事件来对系统进行解耦 xff0c 让系统更便于维护和扩展 SpringBoot项目默认是支持事件的 xff0c 我们只需要自定义事件 xff0c 然后发布事件 xff0c 之后监听事件处理业务逻辑即可 SpringBo
  • STM32F4串口通信(UART)详解

    UART串口通信 我们在生活中处处都会接触到或者是用到通信 QQ 微信 电话 这些都是最常见的人与人之间远程无线通信的方式 那么也有像红外遥控 蓝牙数据传输等器件或硬件之间的通信 这些通信方式都有一些共同点 无线 易受干扰 信号变差 等 而
  • 高度自定义的简繁转换 VS2022 C++ 工程

    首先秀一下简繁转换结果图 如下 include lt iostream gt include 34 KOpenCC KOpenCCExport h 34 include lt string gt ifdef WIN64 pragma com
  • 关于 make_unique 和 make_shared

    C 43 43 14 才加入make unique xff0c 据说当时忘记实现了 那么C 43 43 11 可以自己实现这个功能 xff1a template lt typename T typename Args gt std uniq