C++之智能指针std::unique_ptr与std::make_unique分配内存方式总结(二百六十四)

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

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

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

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

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之智能指针分配内存方式总结

2.std::unique_ptr和std::make_unique智能指针介绍

  • std::unique_ptr和std::make_unique是C++11引入的两个重要的智能指针,它们的主要目的是自动管理动态分配的内存,防止内存泄漏,并简化资源的生命周期管理。下面是对这两个工具的详细介绍。
std::unique_ptr
std::unique_ptr是一个独占所有权的智能指针。这意味着,同一时间内,只能有一个unique_ptr指向某个对象。
当unique_ptr对象被销毁(例如离开作用域)时,它所指向的对象也会被自动删除。
这种独占所有权的特性使unique_ptr在需要严格管理资源生命周期的场合中特别有用。
  • 使用std::unique_ptr的基本语法如下:
std::unique_ptr<int> ptr(new int(42)); // 创建一个指向整数的unique_ptr  
// ... 使用ptr  
// 当ptr离开作用域时,它所指向的整数会被自动删除
std::unique_ptr还支持自定义删除器,这使得它能够处理非new分配的资源,或者执行额外的清理工作。

std::make_unique
std::make_unique是一个函数模板,它用于创建一个std::unique_ptr实例。这个函数模板的出现,
主要是为了解决使用new直接构造unique_ptr时可能发生的异常安全性问题。
使用make_unique可以确保在对象构造失败时不会发生内存泄漏。
  • std::make_unique的基本用法如下:
auto ptr = std::make_unique<int>(42); // 创建一个指向整数的unique_ptr,并初始化为42  
// ... 使用ptr  
// 当ptr离开作用域时,它所指向的整数会被自动删除
std::make_unique比直接使用new来构造unique_ptr更加简洁,并且更安全。
它会自动调用unique_ptr的构造函数,并且如果在对象构造过程中抛出异常,make_unique会确保不会泄漏内存。
  • 综上所述,std::unique_ptr和std::make_unique是C++中用于管理动态分配内存的重要工具。
  • 它们不仅提高了代码的安全性,也简化了资源管理的工作,是C++程序员应该熟练掌握的工具。

3.代码实例

<1>.v1.0

struct file {
  void* private_data;
};

auto filp = std::make_unique<file>();

使用了 auto 关键字来自动推导 filp 变量的类型。std::make_unique 工厂函数用于创建一个新的 file 对象,并返回一个对应类型的 std::unique_ptr。
由于使用了 auto 关键字,编译器会自动推导出 filp 的类型为 std::unique_ptr。

<2>.v2.0

struct file {
  void* private_data;
};

std::unique_ptr<struct file> filp(new file()); // 使用 std::unique_ptr 管理内存

这是最基本的使用方式,直接使用 new 运算符手动创建 file 对象,并将其传递给 std::unique_ptr 构造函数,让 std::unique_ptr 接管这个对象的所有权。

<3>.v3.0

struct file {
  void* private_data;
};

std::unique_ptr<struct file> filp(std::make_unique<file>());

这种写法利用了 std::make_unique 工厂函数,它在 C++14 中引入,更为推荐。
std::make_unique 会直接调用 new 运算符来分配内存,并返回一个对应类型的 std::unique_ptr。
该写法与第二种写法效果相同,只是使用了 std::make_unique 来进行内存分配。

<4>.v4.0

struct file {
  void* private_data;
};

std::unique_ptr<struct file> filp = std::make_unique<file>();

这是第三种写法的简化版,通过使用 = 进行赋值初始化,使代码更简洁,但实际效果与第三种相同。

<5>.v5.0

struct file {
  void* private_data;
};

std::unique_ptr<struct file> filp = std::make_unique<struct file>();

与第四种写法相似,只是在 std::make_unique 的模板参数中指定了 struct file,而不是简单地使用 file。
这种写法是对类型的显式说明,但在这个例子中,效果与第四种写法完全相同。

<6>.总结:

  • 总的来说,这五种写法的实际效果都是一样的,都会创建一个动态分配的 file 对象并使用 std::unique_ptr 管理其内存
  • 它们的区别在于语法风格可读性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Zblog搭建博客网站】windows环境搭建属于自己的博客并发布上线 – cpolar内网穿透

目录 1. 前言 2. Z-blog网站搭建 2.1 XAMPP环境设置 2.2 Z-blog安装 2.3 Z-blog网页测试 2.4 Cpolar安装和注册 3. 本地网页发布 3.1. Cpolar云端设置 3.2 Cpolar本地设置 4. 公网访问测试 5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网…

Nacos单机版安装

1. 下载 nacos-server-2.0.3.tar.gz 官网 https://github.com/alibaba/nacos/releases 2. 上传到服务器 3. 解压 tar -zxvf nacos-server-2.0.3.tar.gz -C /opt 4. 配置数据库 4.1准备好mysql数据库 4.2创建一个新的数据库 创建新数据库nacos 4.3执行nacos建库脚本 在…

XMind 2023 下载地址及安装教程

XMind是一款流行的思维导图软件&#xff0c;它帮助用户以图形化的方式组织和呈现思维、概念和信息。XMind可以应用于各个领域&#xff0c;如项目管理、思维导图、会议记录、学习笔记等。 XMind提供了直观和易于使用的界面&#xff0c;用户可以通过拖放和连线来创建思维导图。它…

2024第16届成都学校团餐供应链展6月1日举办

2024第16届成都学校团餐供应链展6月1日举办 邀请函 主办单位&#xff1a; 中国西部教体融合博览会组委会 承办单位&#xff1a;重庆港华展览有限公司 博览会主题&#xff1a;责任教育 科教兴邦 学校团餐&#xff0c;就是老师和学生团体用餐的简称&#xff0c;也叫学校食堂…

使用Flutter混淆技术保护应用隐私与数据安全

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

深入理解指针1:指针变量、指针运算、野指针、const修饰指针

生活中我们把门牌号也叫地址&#xff0c;在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起 了新的名字叫&#xff1a;指针。 所以我们可以理解为&#xff1a;内存单元的编号地址指针 1、指针变量 我们知道的是&#xff1a;数组名是数组首元素的地址。也就是说&…

linux离线安装NodeJs

一、官方下载 地址&#xff1a;Node.js — Download Node.js 选择linux系统版本 为了防止安装过程出现一些适配问题&#xff0c;我没有选择下载最新版&#xff0c;实际应该下载你的前端所用的nodejs版本 未完待续。。

Object 类的使用

如何理解根父类 类 java.lang.Object是类层次结构的根类&#xff0c;即所有其它类的父类。每个类都使用 Object 作为超类。 Object类型的变量与除Object以外的任意引用数据类型的对象都存在多态引用 method(Object obj){…} //可以接收任何类作为其参数 Person o new Person(…

奇趣相机AI摄影,让每个儿童成长故事都独一无二

随着科技的日新月异&#xff0c;亲子互动方式也在不断进化。近日&#xff0c;一款名为“奇趣相机”的微信小程序凭借其精准捕捉亚洲儿童特质与激发创意的独特功能&#xff0c;在年轻父母群体中引发热烈关注。这款应用程序不仅革新了儿童摄影的传统模式&#xff0c;更成为连接科…

iOS App Store审核要求与Flutter应用的兼容性分析

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

Node.js-知识点学习总结归纳

Node.js-知识点学习总结归纳 安装nodenode运行方式通过Node.js直接运行js文件&#xff08;也就不用通过网页html了&#xff09;绝对路径调用:相对路径调用&#xff1a;直接运行js命令&#xff1a; Vscode控制台使用node运行js文件 安装node 这个就不用讲了吧&#xff0c;网上搜…

浅谈物联网高速公路智慧配电室系统构建方案

关键词&#xff1a;高速公路&#xff1b;智慧供配电&#xff1b;电力监控&#xff1b;配电室智能运维托管&#xff1b;安全隐患 0、引言 随着高速公路事业的不断发展和路网的不断延伸&#xff0c;传统的管理方式已难以满足日益增长的需求&#xff0c;动态管理和安全隐患预警成…

使用Python绘制发散条形图案例

发散条形图用于简化多个组的比较。它的设计允许我们比较各组中的数值。它还帮助我们快速地想象出有利的和不利的或积极的和消极的反应。条形图由从中间开始的两个水平条的组合组成-一个条从右向左延伸&#xff0c;另一个从左向右延伸。条形的长度与它所代表的数值相对应。 通常…

<网络> 网络Socket 编程基于UDP协议模拟简易网络通信

目录 前言&#xff1a; 一、预备知识 &#xff08;一&#xff09;IP地址 &#xff08;二&#xff09;端口号 &#xff08;三&#xff09;端口号与进程PID &#xff08;四&#xff09;传输层协议 &#xff08;五&#xff09;网络字节序 二、socket 套接字 &#xff08;…

【javaWeb 第十篇】(SpringBoot )yml配置文件

yml配置文件 配置文件参数配置化yml配置文件yml配置文件的基本语法yml数据格式 yml配置ConfigurationProperties 配置文件 参数配置化 为什么要使用配置文件配置参数&#xff1a; 以阿里云OSS工具类为例&#xff0c;在工具类中&#xff0c;需要给出连接阿里云服务器的种种参数…

delphi获取windows右下角任务栏图标信息

今天在群里,看有人问怎么获取windows右下角任务栏图标信息 win7 x64 测试通过 unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs,commctrl, Vcl.StdCtr…

MVC模式和三层架构

一.概述 M:Model&#xff0c;业务模型&#xff0c;处理业务V&#xff1a;View&#xff0c;视图&#xff0c;界面展示C&#xff1a;Controller&#xff0c;控制器&#xff0c;处理请求&#xff0c;调用模型和视图 M即model模型是指模型表示业务规则。在MVC的三个部件中&#xf…

鸿蒙OS开发实例:【ArkTS类库异步并发简述Promise】

Promise和async/await提供异步并发能力&#xff0c;是标准的JS异步语法。异步代码会被挂起并在之后继续执行&#xff0c;同一时间只有一段代码执行&#xff0c;适用于单次I/O任务的场景开发&#xff0c;例如一次网络请求、一次文件读写等操作。异步语法是一种编程语言的特性&am…

云原生:为企业带来的7大价值

在数字化浪潮席卷全球的今天&#xff0c;企业正面临着前所未有的机遇与挑战。云原生技术&#xff0c;以其独特的优势&#xff0c;正逐渐成为企业实现数字化转型的重要"工具"。今天我们就来聊聊&#xff0c;云原生为企业带来的价值。 &#x1f525;提升敏捷性 云原生架…