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

unique_ptr初始化

`std::unique_ptr` 是 C++11 引入的智能指针,用于管理动态分配的对象的生命周期。`unique_ptr` 确保每个动态分配的对象有且仅有一个所有者,当 `unique_ptr` 超出作用域时,它会自动释放其管理的对象。以下是 `std::unique_ptr` 的一些常见初始化方法。

### 1. 使用 `std::make_unique`

`std::make_unique` 是 C++14 中引入的函数,提供了一种安全的方式来创建 `unique_ptr`。它会自动推导类型并分配内存,避免了手动使用 `new`。

```cpp
#include <memory>

int main() {
    // 使用 std::make_unique 创建 unique_ptr
    auto ptr = std::make_unique<int>(42); // 创建一个指向整数的 unique_ptr
    return 0;
}
```

### 2. 直接使用 `new` 运算符

可以直接使用 `new` 运算符来初始化 `unique_ptr`。这种方法需要显式地使用 `new` 关键字。

```cpp
#include <memory>

int main() {
    // 直接使用 new 初始化 unique_ptr
    std::unique_ptr<int> ptr(new int(42)); // 创建一个指向整数的 unique_ptr
    return 0;
}
```

### 3. 初始化为空

可以初始化一个空的 `unique_ptr`,随后可以在需要时赋值。

```cpp
#include <memory>

int main() {
    // 初始化为空
    std::unique_ptr<int> ptr; // ptr 是 nullptr
    ptr = std::make_unique<int>(42); // 赋值
    return 0;
}
```

### 4. 通过移动构造函数

如果有一个现有的 `unique_ptr`,可以通过移动构造函数来初始化另一个 `unique_ptr`。注意,这样会使源指针变为 nullptr。

```cpp
#include <memory>

int main() {
    auto ptr1 = std::make_unique<int>(42); // ptr1 拥有 42
    std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr2 现在拥有 42,ptr1 变为 nullptr
    return 0;
}
```

### 5. 通过自定义删除器

可以使用自定义删除器初始化 `unique_ptr`,这在需要特定的释放操作时非常有用。

```cpp
#include <memory>
#include <iostream>

struct CustomDeleter {
    void operator()(int* p) const {
        std::cout << "Deleting pointer" << std::endl;
        delete p;
    }
};

int main() {
    // 使用自定义删除器初始化 unique_ptr
    std::unique_ptr<int, CustomDeleter> ptr(new int(42), CustomDeleter());
    return 0;
}
```

### 总结

- **推荐使用 `std::make_unique`**:在 C++14 及更高版本中,它提供了更安全的内存管理和避免内存泄漏的机制。
- **直接使用 `new`**:在 C++11 中,`new` 是有效的初始化方法,但需要注意资源管理。
- **自定义删除器**:在特定场景下需要使用自定义删除逻辑时,可以使用自定义删除器。

使用 `unique_ptr` 的主要目的是管理动态内存,确保在超出作用域时自动释放资源,从而避免内存泄漏。

http://www.lryc.cn/news/471709.html

相关文章:

  • HelloCTF [RCE-labs] Level 8 - 文件描述和重定向
  • DEVOPS: 集群伸缩原理
  • 什么是SMO算法
  • MySQL根据.idb数据恢复脚本,做成了EXE可执行文件
  • Spring Boot面试题
  • 原生页面引入Webpack打包JS
  • 健康之路押注医药零售:毛利率下滑亏损扩大,医疗咨询人次大幅减少
  • 【人工智能-初级】第7章 聚类算法K-Means:理论讲解与代码示例
  • HOT 100 技巧题(136/169/75/31/287)
  • 什么是时间戳?怎么获取?有什么用?
  • LeetCode:459重复的子字符串
  • 【含开题报告+文档+PPT+源码】基于SSM的旅游与自然保护平台开发与实现
  • 【ANTs】医疗影像工具ANTs多种安装方式教程
  • 想要音频里的人声,怎么把音频里的人声和音乐分开?
  • python代码中通过pymobiledevice3访问iOS沙盒目录获取app日志
  • Spring AOP 使用方法总结
  • LeetCode 每日一题 2024/10/21-2024/10/27
  • 不到1500元的I卡可以玩转3A大作吗?撼与科技Intel Arc A750显卡游戏性能实
  • STK与MATLAB互联——仿真导航卫星与地面用户间距离和仰角参数
  • js面试问题笔记(一)
  • pip 和 pipx 的主要区别?
  • 4457M数字示波器
  • 【永中软件-注册/登录安全分析报告】
  • Tomcat作为web的优缺点
  • conda虚拟环境中安装cuda方法、遇到的问题
  • 【CPN TOOLS建模学习】设置变迁的属性
  • 一个简单的例子,说明Matrix类的妙用
  • 【C++】类和对象(四):析构函数
  • linux中各目录作用及介绍
  • v4.7版本使用线下付款方式不给管理员发送新订单通知问题修复