Android常用C++特性之std::make_unique

ops/2024/10/22 13:37:35/

声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。

std::make_unique 是 C++14 引入的一个函数模板,用于创建类型为 std::unique_ptr 的智能指针。智能指针用于管理动态分配的对象,在其生命周期结束时自动释放资源,避免手动调用 delete 来管理内存。std::make_unique 提供了一种安全、简洁的方式来创建 std::unique_ptr,并避免使用 new 关键字。

std::make_unique 的优势

  1. 安全性:相比直接使用 newstd::make_unique 可以防止内存泄漏。因为在异常抛出时,即使构造函数抛出异常,内存也会安全释放。
  2. 简洁性:使用 std::make_unique 可以减少代码量,使代码更简洁,不需要手动调用 newdelete
  3. 高效性:它直接构造对象并将其交给 std::unique_ptr,避免了额外的赋值操作。

语法

std::unique_ptr<T> ptr = std::make_unique<T>(constructor_args);
  • T 是你想创建的对象的类型。
  • constructor_args 是传递给 T 构造函数的参数。

示例

1. 创建单个对象
#include <iostream>
#include <memory>struct MyClass {MyClass(int x) : value(x) {std::cout << "MyClass constructor, value: " << value << std::endl;}~MyClass() {std::cout << "MyClass destructor" << std::endl;}int value;
};int main() {// 使用 std::make_unique 创建 std::unique_ptrstd::unique_ptr<MyClass> ptr = std::make_unique<MyClass>(10);std::cout << "Value: " << ptr->value << std::endl;  // 访问成员变量return 0;  // 在这里 ptr 会自动销毁,调用析构函数
}

输出:

MyClass constructor, value: 10
Value: 10
MyClass destructor

在这个例子中,我们使用 std::make_unique 创建了一个指向 MyClass 对象的 std::unique_ptr。当 ptr 退出作用域时,std::unique_ptr 会自动调用对象的析构函数并释放内存。

2. 创建数组

对于动态分配数组的情况,也可以使用 std::make_unique,不过需要显式指定数组类型。

#include <iostream>
#include <memory>int main() {// 使用 std::make_unique 创建一个动态分配的数组std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);for (int i = 0; i < 5; ++i) {arr[i] = i * 10;}for (int i = 0; i < 5; ++i) {std::cout << "arr[" << i << "] = " << arr[i] << std::endl;}// 在这里,arr 自动销毁并释放内存return 0;
}

输出:

arr[0] = 0
arr[1] = 10
arr[2] = 20
arr[3] = 30
arr[4] = 40

std::make_unique<int[]> 创建了一个长度为 5 的 int 数组,并通过 std::unique_ptr 自动管理它的生命周期。

使用 std::unique_ptr 的注意事项

  • 独占所有权std::unique_ptr 是独占所有权的智能指针,意味着它不能被复制。如果你尝试复制一个 std::unique_ptr,编译器会报错。

    std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(10);
    std::unique_ptr<MyClass> ptr2 = ptr1;  // 错误,无法复制 unique_ptr
    

    但是,可以通过 std::move 来转移所有权:

    std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(10);
    std::unique_ptr<MyClass> ptr2 = std::move(ptr1);  // 转移所有权
    
  • 自动释放资源:当 std::unique_ptr 超出作用域时,自动调用 delete,不需要手动管理资源释放。

总结

  • std::make_unique 提供了一种更简洁和安全的方式来创建 std::unique_ptr,避免了手动管理内存的麻烦。
  • std::unique_ptr 提供独占的所有权,确保对象在不再使用时自动释放资源。
  • 使用 std::make_unique 可以减少使用 newdelete 时的出错风险。

http://www.ppmy.cn/ops/118954.html

相关文章

PHP程序如何实现限制一台电脑登录?

PHP程序如何实现限制一台电脑登录&#xff1f; 可以使用以下几种方法&#xff1a; 1. IP地址限制&#xff1a;在PHP中&#xff0c;可以通过获取客户端的IP地址&#xff0c;然后与允许登录的IP地址列表进行比对。如果客户端的IP地址不在列表中&#xff0c;就禁止登录。 “php $…

Qt 文件操作

目录 Qt 文件操作1. I/O设备1.1 I/O设备的类型1.2 打开模式 2. 文件读写2.1 QFile打开文件写文件读文件静态函数 2.2 StreamQTextStreamQDataStream 2.3 QFileInfo 3. 配置文件3.1 QSettings基本用法设置和获取值配置文件格式常用函数分组操作 3.2 QJsonDocument主要功能解析 J…

ValueError: Out of range float values are not JSON compliant

可能原因一 可能原因二 数据里面有NaN

51单片机的光照强度检测【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块光照传感器按键蜂鸣器LED等模块构成。适用于光照强度检测、光照强度测量报警等相似项目。 可实现功能: 1、LCD1602实时显示光照强度信息 2、光照强度传感器&#xff08;电位器模拟&#xff09;采集光照信息 3、可…

【MyBatis-Plus】 学习记录 常用功能及代码生成器使用

文章目录 1. 环境准备2. 创建基础实体类3. 编写 Mapper 接口4. Service 层5. 控制器层6. 分页功能7. 条件构造器8. 配置乐观锁9. 常见问题10. 代码生成器1. 创建数据库表2. 引入依赖3. 配置数据库连接4. 编写代码生成器5. 运行代码生成器6. 查看生成的代码 MyBatis-Plus 是一个…

Bugku 渗透测试1

描  述: 甲公司邀请你对他们公司进行网络安全测试&#xff0c;但是甲公司只给了一个官网链接你能打到他们内网吗&#xff1f; 打开靶场地址 1、场景1 查看网站源码&#xff0c;查看最下面&#xff0c;得到flag。 2、场景2 根据场景1提示&#xff0c;下个flag网站管理员才能…

WinRAR技巧:如何给多个压缩包设置同一个密码

RAR压缩包是大家经常使用的文件&#xff0c;并且可以进行加密&#xff0c;也是一种文件加密方式&#xff0c;那么当你有很多文件都需要压缩加密&#xff0c;b并且想要设置同一个密码&#xff0c;防止以后忘记密码&#xff0c;该如何高效的完成这个工作呢&#xff1f;今天分享如…

什么是大语言模型?

一、语言模型 要了解大语言模型&#xff0c;首先应当知道什么是语言模型&#xff08;Language Model&#xff09;。语言模型是自然语言处理&#xff08;NLP&#xff09;领域中的一种模型&#xff0c;它用于理解、生成或者处理自然语言文本。语言模型的核心任务是预测一系列单词…