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

std::make_unique小结

1. 概念

在 C++ 中,std::make_unique是一个用于创建std::unique_ptr(独占所有权的智能指针)的工具函数。

std::make_unique的主要目的是方便、安全地创建std::unique_ptr对象,并对动态分配的对象进行管理。它在创建std::unique_ptr的同时,会在合适的时机自动调用所管理对象的构造函数,确保资源的正确分配和初始化。与直接使用new操作符和手动构造std::unique_ptr相比,std::make_unique提供了更简洁、更安全的方式来管理动态分配的资源,并且能够避免一些潜在的错误,例如资源泄漏和异常安全问题。

2. 使用方法

  • 创建单个对象

    可以使用std::make_unique来创建单个对象,例如:

   #include <iostream>#include <memory>class MyClass {public:MyClass() {std::cout << "MyClass constructor called." << std::endl;}~MyClass() {std::cout << "MyClass destructor called." << std::endl;}};int main() {auto ptr = std::make_unique<MyClass>();return 0;}

在这个例子中,std::make_unique<MyClass>()创建了一个MyClass类型的对象,并由std::unique_ptr管理其生命周期。当ptr超出作用域时,MyClass的析构函数会被自动调用,确保资源的正确释放。

  • 创建数组对象

    std::make_unique也可以用于创建动态分配的数组对象,例如:

   #include <iostream>#include <memory>int main() {auto arrPtr = std::make_unique<int[]>(5);for (int i = 0; i < 5; ++i) {arrPtr[i] = i;}return 0;}

在这个例子中,std::make_unique<int[]>(5)创建了一个包含 5 个整数的动态数组,并由std::unique_ptr管理其生命周期。当arrPtr超出作用域时,数组的内存会被自动释放。

  • 作为函数参数传递

    std::make_unique创建的std::unique_ptr可以方便地作为函数参数传递,例如:

   #include <iostream>#include <memory>void processObject(std::unique_ptr<MyClass> objPtr) {std::cout << "Processing object." << std::endl;}int main() {auto ptr = std::make_unique<MyClass>();processObject(std::move(ptr));return 0;}

在这个例子中,std::make_unique<MyClass>()创建的std::unique_ptr被传递给processObject函数。通过使用std::move,将所有权从一个std::unique_ptr转移到另一个,确保资源的正确管理。

使用std::make_unique可以提高代码的安全性和可读性,减少资源管理错误的可能性。它是 C++14 引入的一个非常有用的工具函数,特别是在处理动态分配的资源时。


http://www.mrgr.cn/news/35295.html

相关文章:

  • 【Qt】背景介绍
  • 【代码笔记】
  • Java解决同构字符串问题
  • file zilla server安装以后,client连接,账号登录成功,但是读取目录失败的处理
  • 建筑工程系列专业职称评审条件大全
  • 误删系统引导如何恢复?如何创建系统引导?
  • C++: unordered系列关联式容器
  • MQ的简单梳理
  • 【动态规划】(五)动态规划——子序列问题
  • 前端报错401 【已解决】
  • 快速排序(plus)与单调栈道,力扣912.排序数组​​​​​​​力扣215.数组中的第k大个元素力扣17.14最小的k个数单调栈力扣.柱状图中最大的矩形
  • 美业门店怎么提升业绩?连锁美业门店管理系统收银系统拓客系统源码
  • 【5米光学卫星(资源一号02D/02E卫星)】
  • 鸿蒙OpenHarmony【小型系统内核(用户态启动)】子系统开发
  • 面试官:vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
  • 德蒂企鹅PAEDIPROTECT:德国医研力作,专为敏感肌婴幼儿量身打造
  • 面试面经|大模型算法岗常见面试题100道
  • P7557 [USACO21OPEN] Acowdemia S题解
  • 【软考】多核CPU
  • 2024年9月23日---关于MyBatis框架(2)