C++之shared_ptr、unique_ptr、make_shared、make_unique的区别(一百九十七)

news2024/12/23 2:33:09

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之shared_ptr、unique_ptr、make_shared、make_unique的用法区别

1.shared_ptr、unique_ptr、make_shared、make_unique用法

    1. shared_ptr 是共享所有权的智能指针,可以多个shared_ptr指向同一个对象。对象会在所有 shared_ptr 都被销毁后自动释放。
    1. unique_ptr 是独占所有权的智能指针,一个对象只能由一个 unique_ptr 指向。当 unique_ptr 被销毁或者重置时,对象会被自动释放。
    1. make_shared 是用于创建 shared_ptr 的工厂函数,可以一次性分配内存并创建对象。相比直接使用 shared_ptr 构造函数,make_shared 能够更高效地分配内存并消除额外的内存分配开销。
    1. make_unique 是用于创建 unique_ptr 的工厂函数,可以一次性分配内存并创建对象。

2.shared_ptr、unique_ptr、make_shared、make_unique之间的区别

    1. 所有权:shared_ptr 允许多个指针共享对同一对象的所有权,而 unique_ptr 则是独占所有权,一个对象只能由一个 unique_ptr 指向。
    1. 内存管理:shared_ptr 使用引用计数来管理内存,而 unique_ptr 则使用独占式拥有方式来管理内存。
    1. 创建方式:shared_ptrunique_ptr 都可以直接使用构造函数来创建对象,而 make_sharedmake_unique 是工厂函数,用于一次性分配内存和创建对象。
    1. 平台兼容性:make_shared 在 C++11 中引入,而 make_unique 在 C++14 中引入。所以在使用旧版本的编译器时,可能无法使用这两个工厂函数。

2.实例

<1>.shared_ptr实例

#include <memory>
   #include <iostream>

   class MyClass {
   public:
       MyClass() {
           std::cout << "MyClass object created!" << std::endl;
       }

       ~MyClass() {
           std::cout << "MyClass object destroyed!" << std::endl;
       }
   };

   int main() {
       std::shared_ptr<MyClass> sharedPtr1 = std::make_shared<MyClass>();
       std::shared_ptr<MyClass> sharedPtr2 = sharedPtr1;

       return 0;
   }

<2>.unique_ptr实例

 #include <memory>
   #include <iostream>

   class MyClass {
   public:
       MyClass() {
           std::cout << "MyClass object created!" << std::endl;
       }

       ~MyClass() {
           std::cout << "MyClass object destroyed!" << std::endl;
       }
   };

   int main() {
       std::unique_ptr<MyClass> uniquePtr = std::make_unique<MyClass>();

       return 0;
   }

<3>.make_shared实例

 #include <memory>
   #include <iostream>

   class MyClass {
   public:
       MyClass() {
           std::cout << "MyClass object created!" << std::endl;
       }

       ~MyClass() {
           std::cout << "MyClass object destroyed!" << std::endl;
       }
   };

   int main() {
       std::shared_ptr<MyClass> sharedPtr = std::make_shared<MyClass>();

       return 0;
   }

<4>.make_unique实例

 #include <memory>
   #include <iostream>

   class MyClass {
   public:
       MyClass() {
           std::cout << "MyClass object created!" << std::endl;
       }

       ~MyClass() {
           std::cout << "MyClass object destroyed!" << std::endl;
       }
   };

   int main() {
       std::unique_ptr<MyClass> uniquePtr = std::make_unique<MyClass>();

       return 0;
   }

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

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

相关文章

vue3之pinia简单使用

一、 Pinia介绍 pinia 是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态。就是和vuex一样的实现数据共享。 依据Pinia官方文档&#xff0c;Pinia是2019年由vue.js官方成员重新设计的新一代状态管理器&#xff0c;更替Vuex4成为Vuex5。 Pinia 目前也已经是 vue 官方正式…

PackML 学习笔记(2) OPCUA /PackML

2020年11月11日&#xff0c;OPC 基金会发布了PackML 的配套规范&#xff08;OPC 30050: PackML - Packaging Control&#xff09;。意味着可以使用OPCUA 信息模型来构建PackML 模型了。 如果写一篇技术简介往往是简单的&#xff0c;要去实现这门技术却很难。首先&#xff0c;OP…

浅谈Dead reckoning实现原理以及常用算法

0. 简介 航位推算是一个很常见的定位方法。在知道当前时刻的位置&#xff0c;然后通过imu等传感器去估计下一个时刻的位置。在自动驾驶车辆定位的时候&#xff0c;GPS提供10Hz的定位信息。这每个GPS信息来临的0.1s的间隔里面&#xff0c;车辆位置也会移动很多。那么这个时候就…

Android.bp语法和使用方法讲解

Android.bp语法和使用方法讲解 Android.bp 文件是什么&#xff1f; Android.bp 文件首先是 Android 系统的一种编译配置文件&#xff0c;是用来代替原来的 Android.mk文件的。在 Android7.0 以前&#xff0c;Android 都是使用 make 来组织各模块的编译&#xff0c;对应的编译…

抖店评价有礼怎么设置|成都瀚网科技

随着电商行业的不断发展和竞争的加剧&#xff0c;如何吸引消费者、提高店铺的口碑成为了每个卖家关注的焦点。其中&#xff0c;抖音电商平台的礼貌评价功能受到广大卖家的青睐。那么&#xff0c;如何设置抖店评论才能有礼貌呢&#xff1f;我们一起来讨论一下吧。 如何设置抖店评…

go-zerogo web集成gorm实战

前言 上一篇&#xff1a;go-zero&go web集成redis实战 从零开始基于go-zero搭建go web项目实战-04集成gorm实战 源码仓库地址 源码 https://gitee.com/li_zheng/treasure-box golang gorm 官网地址&#xff1a;https://gorm.io/zh_CN/docs/index.html GORM介绍 Gorm是…

Postman —— HTTP请求基础组成部分

一般来说&#xff0c;所有的HTTP Request都有最基础的4个部分组成&#xff1a;URL、 Method、 Headers和body。 &#xff08;1&#xff09;Method 要选择Request的Method是很简单的&#xff0c;Postman支持所有的请求方式。 &#xff08;2&#xff09;URL 要组装一条Request…

Pytorch Advanced(二) Variational Auto-Encoder

自编码说白了就是一个特征提取器&#xff0c;也可以看作是一个降维器。下面找了一张很丑的图来说明自编码的过程。 自编码分为压缩和解码两个过程。从图中可以看出来&#xff0c;压缩过程就是将一组数据特征进行提取&#xff0c; 得到更深层次的特征。解码的过程就是利用之前的…

python-爬虫-urllib

网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又叫网络蜘蛛、网络机器人&#xff0c;是一种自动化数据采集程序 数据采集 → 数据处理 → 数据存储 常见的工作流程如下&#xff1a; 1.定义采集的目标&#xff08;网站、APP、公众号、小程序&#xff09;&#xff…

RP9学习-2

1.基本元素2 1.1树 可以收起 添加子菜单 选中树的节点即可添加 移动层级 编辑树属性 选中某行文字&#xff0c;点击Edit Tree Properties 可以把箭头变成加减&#xff0c;另外也可以导入自己的图标 注意要使用自己的图标&#xff0c;需要勾选Show Icon 也可以给某个节点单…

开放式耳机也会有巅峰音质体验-南卡NANK OE PRO

前言 这两年&#xff0c;开放式耳机市场发展迅猛&#xff0c;新品层出不穷&#xff0c;各大耳机厂商也都相继推出了自家的产品。而在众多的厂家中&#xff0c;作为国内开发式耳机的TOP1&#xff0c;南卡通过多年来在业内领域的经验和专业的技术能力&#xff0c;为广大音乐爱好…

fastadmin在前端调用 /api/common/upload 返回未上传文件或超出服务器上传限制

第一步&#xff1a;在api目录直接调用 域名/api/common/upload 上传图片的时候要在Common.php文件里面把验证登录的 protected $noNeedLogin [init]; 方法注释掉。 // protected $noNeedLogin [init];protected $noNeedLogin *;protected $noNeedRight *; 第二步&#…

计算机竞赛 大数据分析:基于时间序列的股票预测于分析

1 简介 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天向大家介绍一个大数据项目 大数据分析&#xff1a;基于时间序列的股票预测于分析 2 时间序列的由来 提到时间序列分析技术&#xff0c;就不得不说到其中的AR/MA/ARMA/ARIMA分析模型。这四种分析方法…

dp(1) - 数字三角形模型

898.数字三角形 题目链接 : 活动 - AcWing 题目 : 给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路径上的数字的和…

利用LinuxPTP进行时间同步(软/硬件时间戳) - 研一

转自&#xff1a;https://blog.csdn.net/BUPTOctopus/article/details/86246335 官方文档&#xff1a;https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s1-using_ptp 查看网卡是否支持软硬件时间戳&#xff1a; sudo ethtoo…

为什么做期权卖方是比较高胜率的?

期权三大因素&#xff1a;行情方向、时间价值流失、波动率。波动率下降、时间价值流失&#xff0c;震荡行情&#xff0c;这几项对期权卖方交易有利&#xff0c;一般做期权卖方胜率基本可以达70%左右&#xff0c;下文揭秘为什么做期权卖方是比较高胜率的? 一、期权卖方交易如何…

MQTT网关对接水务二次供水管理平台案例

一、客户介绍 随着城市发展和人口增长&#xff0c;对水务行业的监测和管理要求也越来越高。然而&#xff0c;传统的水务行业监测方式存在很多不足&#xff0c;如数据传输的缓慢和不可靠&#xff0c;数据安全风险大等&#xff0c;为了更有效地监测和管理这些信息&#xff0c;供…

电子科大软件系统架构设计——系统规划

文章目录 系统规划定义意义目标任务路径规划规划步骤规划方法业务系统规划法业务流程重组法价值链分析法战略目标集转移法关键成功因素法 项目计划定义要素工作分解活动排序工期预算三点估计法德尔菲法 成本估算与计算进度安排甘特图法PERT图方法 可行性分析技术可行性分析进度…

固定资产电脑怎么编号管理

科技的发展已经深入到了我们的生活中的每一个角落&#xff0c;尤其是在办公室环境中&#xff0c;电脑已经成为了必不可少的工具。然而&#xff0c;随着电脑数量的增加和管理复杂性的提升&#xff0c;如何有效地管理和追踪这些固定资产变得越来越重要。本文将探讨一种创新的方式…

Scrum敏捷开发如何实施

​在当今高度变化的时代&#xff0c;软件开发的环境和要求也在不断变化。传统的开发方法往往难以适应这种快速变化&#xff0c;因此&#xff0c;一种新的软件开发方法——敏捷开发逐渐得到了广泛的关注和应用。 敏捷开发的实施可以按照以下步骤进行&#xff1a; 1、明确产品愿…