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 管理其内存
  • 它们的区别在于语法风格可读性

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

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

相关文章

第十四届蓝桥杯大赛软件赛省赛C/C++大学 B 组

第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组 文章目录 第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组1、日期统计2、01串的熵3、冶炼金属4、飞机降落5、接龙数列6、岛屿个数7、子串简写8、整数删除9、景区导游10、砍树 1、日期统计 分析&#xff1a; 本题的意思就是2023年一整年&a…

Navicat for MySQL 15免费注册方法

一、效果图如下&#xff1a; 注&#xff1a;此方法仅用于非商业用途&#xff0c;请勿传播&#xff0c;否则后果自负。 二、下载安装 下载安装包&#xff0c;分为32位和6位&#xff0c;下载文件名&#xff1a;Navicat for MySQL 15.zip&#xff08;https://download.csdn.net/…

【嵌入式硬件】光耦

1.光耦作用 光耦一般用于信号的隔离。当两个电路的电源参考点不相关时,使用光耦可以保证在两边不共地的情况下,完成信号的传输。 2.光耦原理 光耦的原理图如下所示,其内部可以看做一个特殊的“三极管”; 一般的三极管是通过基极B和发射极E间的电流,去控制集电极C和发射极…

如何同时使用多个Gmail账号而不被关联?

您的业务活动需要多个 Gmail 帐户吗&#xff1f;出海畅游&#xff0c;Gmail账号是少不了的工具之一&#xff0c;可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台&#xff0c;可以说是海外网络的“万能锁”。但是大家都知道&#xff0c;以上这些平台注册多账号如果产生关…

从零开始 使用OMNET++结合VEINS,INET和SUMO的联合仿真

背景知识 当我们探索未来的交通系统和智能交通解决方案时&#xff0c;车辆到一切&#xff08;Vehicle-to-Everything, V2X&#xff09;通信技术显得尤为重要。V2X是指在车辆与车辆&#xff08;V2V&#xff09;、车辆与基础设施&#xff08;V2I&#xff09;、车辆与行人&#x…

h5 笔记1

Internet是InternationalNetwork的缩写&#xff0c;又称“因特网”。它是将全世界数以千计的上网设备通过TCP/IP通信协议连接在一起。Internet上的服务众多&#xff0c;主要的服务有WWW(万维网)、E-Mail(电子邮件)、FTP(FileTransferProtocol&#xff0c;文件传输协议)、Telnet…

计算机网络(第八版)-第1章课后习题参考答案

计算机网络(第八版)-第1章课后习题参考答案 本文是对自己之前文章的格式化&#xff1a;https://blog.csdn.net/qq_46396470/article/details/132788972?spm1001.2014.3001.5502 T1-01 计算机网络向用户可以提供哪些服务&#xff1f; 连通性和共享 &#xff0c;例如音频&…

SmartChart的部署以及可能遇见的报错解决方案

简介 数据可视化是一种将数据转化为图形的技术&#xff0c;可以帮助人们更好地理解和分析数据。但是&#xff0c;传统的数据可视化开发往往需要编写大量的代码&#xff0c;或者使用复杂的拖拽工具&#xff0c;不仅耗时耗力&#xff0c;而且难以实现个性化的需求。有没有一种更…

无需注册即可使用 ChatGPT;Poe 创始人:大模型幻觉是创业公司的机会丨RTE 开发者日报 Vol.176

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

labelme、labelimg的安装及使用(含格式转换)

目录 labelme、labelimg简要介绍 labelme labelimg Anaconda虚拟环境 labelme安装 labelme的使用 labelimg安装 labelimg的使用 json格式转换 标注便携操作 labelme、labelimg简要介绍 labelme和labelimg都是图像标注工具&#xff0c;它们在机器学习和计算机视觉领…

【卫星家族】 | 高分六号卫星影像及获取

1. 卫星简介 高分六号卫星&#xff08;GF-6&#xff09;于2018年6月2日在酒泉卫星发射中心成功发射&#xff0c;是高分专项中的一颗低轨光学遥感卫星&#xff0c;也是我国首颗精准农业观测的高分卫星&#xff0c;具有高分辨率、宽覆盖、高质量成像、高效能成像、国产化率高等特…

智慧驿站式的“智慧公厕”,给城市新基建带来新变化

随着智慧城市建设的推进&#xff0c;智慧驿站作为一种多功能城市部件&#xff0c;正逐渐在城市中崭露头角。这些智慧驿站集合了智慧公厕的管理功能&#xff0c;为城市的新基建带来了全新的变革。本文以智慧驿站智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案…