【智能指针】std::unique_ptr

std::unique_ptr 是 C++11 引入的智能指针,用于管理动态分配的内存,通过独占所有权和自动释放机制提升代码安全性。以下是其核心要点及使用示例:


1. 核心特性

  • 独占所有权:同一时间只能有一个 unique_ptr 拥有资源,禁止复制,支持移动语义(通过 std::move)。
  • 自动释放:当 unique_ptr 离开作用域或被重置时,自动释放其管理的资源。
  • 轻量高效:默认无额外内存开销,性能与裸指针相当。

2. 基础用法

创建与初始化
  • 单个对象
    std::unique_ptr<int> ptr1 = std::make_unique<int>(42); // 推荐:安全且高效
    std::unique_ptr<Widget> ptr2(new Widget());           // 直接构造(需谨慎)
  • 数组​(C++14 起支持 T[]):
    std::unique_ptr<int[]> arr = std::make_unique<int[]>(10); // 管理动态数组
所有权转移
auto ptr1 = std::make_unique<int>(100);
auto ptr2 = std::move(ptr1);  // ptr1 变为 nullptr,ptr2 获得所有权
主动释放资源
ptr2.reset();                 // 释放资源并将 ptr2 置空
int* raw_ptr = ptr2.release(); // 返回原始指针,ptr2 置空(需手动管理 raw_ptr)

3. 高级用法

自定义删除器
  • 函数指针形式
    auto deleter = [](FILE* f) { fclose(f); };
    std::unique_ptr<FILE, decltype(deleter)> file_ptr(fopen("data.txt", "r"), deleter);
  • 状态化删除器​(需额外存储空间):
    struct CustomDeleter {
        void operator()(int* p) { delete p; /* 其他操作 */ }
    };
    std::unique_ptr<int, CustomDeleter> ptr(new int, CustomDeleter());
作为函数参数
  • 传递所有权
    void take_ownership(std::unique_ptr<Widget> ptr) { /* ... */ }
    auto widget = std::make_unique<Widget>();
    take_ownership(std::move(widget)); // 所有权转移至函数内部
  • 仅访问资源​(避免所有权转移):
    void use_resource(const Widget& obj) { /* ... */ }
    auto widget = std::make_unique<Widget>();
    use_resource(*widget); // 传递引用,保留所有权

4. 注意事项

  • 禁止复制
    std::unique_ptr<int> ptr1 = std::make_unique<int>(10);
    // std::unique_ptr<int> ptr2 = ptr1; // 错误:尝试复制
  • 避免悬空指针
    int* raw = ptr1.get(); // 获取原始指针(不释放所有权)
    // 确保 raw 在 ptr1 有效期内使用
  • 异常安全
    void safe_function() {
        auto ptr = std::make_unique<Resource>(); // 即使后续代码抛出异常,ptr 仍会释放资源
        // 可能抛出异常的操作
    }

5. 性能与适用场景

  • 零额外开销:默认删除器通过空基类优化,大小等于裸指针。
  • 适用场景
    • 管理动态对象或数组。
    • 作为工厂函数返回值(明确所有权转移)。
    • 替代 new/delete 手动内存管理。

示例:管理动态数组

#include <memory>
#include <iostream>

int main() {
    // 创建管理 int 数组的 unique_ptr
    std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);
    for (int i = 0; i < 5; ++i) {
        arr[i] = i * 2;
    }

    // 输出数组内容
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " "; // 输出:0 2 4 6 8
    }

    // 自动释放数组内存(无需手动 delete[])
    return 0;
}

总结

std::unique_ptr 是 C++ 中管理动态内存的首选工具,通过强制独占所有权和自动释放机制,显著减少内存泄漏和资源管理错误。优先使用 std::make_unique 创建实例,仅在需要时使用自定义删除器或裸指针操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值