侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1824 篇文章
  • 累计收到 0 条评论

使用智能指针管理动态数组

2025-12-12 / 0 评论 / 4 阅读

题目

使用智能指针管理动态数组

信息

  • 类型:问答
  • 难度:⭐

考点

unique_ptr动态数组管理, 智能指针基础用法, 资源自动释放

快速回答

使用 std::unique_ptr 管理动态数组时:

  • 必须使用数组形式:std::unique_ptr<int[]>
  • 通过下标 ptr[index] 访问元素
  • 避免手动 delete[],智能指针会自动释放内存
## 解析

问题背景

在C++中,使用 new[] 分配的动态数组需要匹配 delete[] 释放内存。智能指针可以自动化这一过程,但需要特殊语法。

核心原理

std::unique_ptr 通过模板特化支持动态数组:

  • 标准形式:std::unique_ptr<T> 默认使用 delete
  • 数组特化:std::unique_ptr<T[]> 使用 delete[]
编译器会根据模板类型自动选择正确的释放方式。

代码示例

#include <memory>

// 正确用法
void demo() {
    // 创建含5个整数的动态数组
    std::unique_ptr<int[]> arr(new int[5]);

    // 初始化数组
    for (int i = 0; i < 5; ++i) {
        arr[i] = i * 10;  // 通过下标访问
    }

    // 不需要手动释放!离开作用域时自动调用 delete[]
}

// 错误用法示例
void wrong_demo() {
    // 错误:使用非数组形式管理动态数组
    std::unique_ptr<int> arr(new int[5]);

    // 错误:尝试下标访问(编译失败)
    // arr[2] = 100;

    // 未定义行为:将调用 delete 而非 delete[]
}

最佳实践

  • 显式指定数组类型:始终使用 std::unique_ptr<T[]> 管理动态数组
  • 避免手动释放:依赖RAII机制自动释放资源
  • 优先使用标准容器:如 std::vector 比原始动态数组更安全
  • 工厂函数创建:C++14+ 推荐 auto arr = std::make_unique<int[]>(5);

常见错误

  • 误用 std::unique_ptr<T> 管理数组(导致 delete 而非 delete[]
  • 尝试对数组智能指针使用 *-> 运算符(应使用下标)
  • 与普通指针混用:int* raw = arr.get(); 需谨慎避免悬空指针

扩展知识

  • shared_ptr 管理数组:C++17+ 支持 std::shared_ptr<int[]>,早期版本需自定义删除器:
    std::shared_ptr<int> sp(new int[5], [](int* p) { delete[] p; });
  • std::vector 对比:智能指针管理数组时缺乏大小信息,std::vector 更推荐用于动态数组场景
  • 自定义删除器:可用于管理特殊资源(如文件句柄)