当前位置: 首页 > article >正文

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

声明:本文内容生成自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_ptr
    std::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.kler.cn/news/327867.html

相关文章:

  • 【机器学习基础】Transformer学习
  • CATIA风扇
  • 数据可视化分析系统-解锁企业信息的利器
  • 小徐影院:Spring Boot技术下的影院革新
  • SOMEIP_ETS_143: SD_Request_non_existing_ServiceID
  • 完整网络模型训练(一)
  • c语言实例
  • GWAS分析中显著位点如何注释基因:excel???
  • Ubuntu22.04安装VMware Tools
  • Autosar CP系列:传感器/执行器设计模式
  • Python机器学习:数据预处理与清洗的打开方式
  • wordpress Contact form 7发件人邮箱设置
  • 大数据、人工智能、云计算、物联网、区块链序言【大数据导论】
  • 【Linux】进程+权限管理+软硬链接+其他命令
  • 【网络安全】PII:接口未授权访问敏感数据
  • Leecode热题100-48.旋转图像
  • Java基础(Arrays工具类)(asList()方法)(详细)
  • SpringBoot实现社区医院数据集成解决方案
  • 【C++】I/O流的使用介绍
  • SpringCloud-Alibaba第二代微服务快速入门
  • TCP编程:从入门到实践
  • vscode中文插件安装后不起作用
  • IoT网关的主要功能有哪些?天拓四方
  • 2025考研,报名和初试时间定了!
  • 机器学习学习笔记-20240927
  • ResNet50V2:口腔癌分类
  • 防反接电路设计
  • spark计算引擎-架构和应用
  • linux修改命令别名的方式
  • 【学习笔记】手写 Tomcat 六