首页 > 后端开发 > C++ > 正文

C++智能指针能管理数组吗 unique_ptr和shared_ptr对数组的支持

P粉602998670
发布: 2025-08-03 09:46:01
原创
789人浏览过

c++++的智能指针中unique_ptr天然支持数组管理,而shared_ptr需要自定义删除器。1. unique_ptr通过声明数组类型如std::unique_ptr<int[]>可自动调用delete[]释放内存,推荐使用std::make_unique创建数组;2. shared_ptr默认不支持数组,必须手动提供删除器如lambda表达式确保调用delete[],可通过封装模板函数简化操作;3. 实际开发中,若需独占数组资源优先选unique_ptr,若需共享则用带删除器的shared_ptr,或考虑标准库容器如vector更安全便捷。

C++智能指针能管理数组吗 unique_ptr和shared_ptr对数组的支持

C++的智能指针确实可以管理数组,但不是所有智能指针都“天生”支持数组,需要特别注意用法。

unique_ptr
登录后复制
shared_ptr
登录后复制
都能用来管理数组资源,但它们在处理数组时的行为和普通对象略有不同。

C++智能指针能管理数组吗 unique_ptr和shared_ptr对数组的支持

unique_ptr
登录后复制
对数组的支持

unique_ptr
登录后复制
是专为独占式资源管理设计的,它对数组的支持是原生支持的,只要你在声明的时候指定数组类型即可。

C++智能指针能管理数组吗 unique_ptr和shared_ptr对数组的支持
std::unique_ptr<int[]> arr(new int[10]);
登录后复制

这样声明后,

unique_ptr
登录后复制
会使用数组版本的析构函数来释放内存(即自动调用
delete[]
登录后复制
而不是
delete
登录后复制
),避免了内存泄漏或未定义行为。

立即学习C++免费学习笔记(深入)”;

使用建议:

  • 如果你管理的是一个动态分配的数组,优先使用
    unique_ptr<T[]>
    登录后复制
  • 不要试图用
    unique_ptr<T>
    登录后复制
    去管理数组,那样会导致错误释放(只调用
    delete
    登录后复制
    )。
  • 可以配合
    std::make_unique
    登录后复制
    来创建数组(C++14起支持):
auto arr = std::make_unique<int[]>(10);
登录后复制

shared_ptr
登录后复制
对数组的支持

shared_ptr
登录后复制
的默认构造并不知道你要管理的是数组类型,因此如果你直接传入数组指针,它不会自动调用
delete[]
登录后复制
,而是调用
delete
登录后复制
,这会导致未定义行为。

ImgCleaner
ImgCleaner

一键去除图片内的任意文字,人物和对象

ImgCleaner 220
查看详情 ImgCleaner
C++智能指针能管理数组吗 unique_ptr和shared_ptr对数组的支持

不过你可以通过自定义删除器的方式来解决这个问题:

std::shared_ptr<int> arr(new int[10], [](int* p){ delete[] p; });
登录后复制

这样就能确保数组被正确释放。

使用技巧:

  • 管理数组时必须手动提供删除器,否则有风险。
  • 删除器可以用 lambda、函数指针或者函数对象。
  • 如果你不小心漏掉了删除器,可能会引发崩溃或内存泄漏。
  • 也可以封装成模板函数简化重复代码:
template<typename T>
using array_deleter = std::default_delete<T[]>;

template<typename T>
std::shared_ptr<T> make_array(size_t size) {
    return std::shared_ptr<T>(new T[size], array_deleter<T>());
}
登录后复制

实际开发中怎么选?

在实际项目中,选择哪种智能指针管理数组,取决于你的需求:

  • 如果只需要单个对象拥有数组资源,就用
    unique_ptr<T[]>
    登录后复制
    ,简单安全。
  • 如果多个对象需要共享数组资源,那就用
    shared_ptr
    登录后复制
    加上删除器。
  • 如果你不想自己管理数组,也可以考虑使用标准库容器如
    std::vector
    登录后复制
    std::array
    登录后复制
    ,它们本身就带有内存管理功能,更安全也更容易使用。

基本上就这些。智能指针对数组的支持不算复杂,但容易因为疏忽导致问题,特别是

shared_ptr
登录后复制
没配好删除器的情况。只要记住:

  • unique_ptr<T[]>
    登录后复制
    天然支持数组
  • shared_ptr
    登录后复制
    需要自定义删除器

就不会踩坑了。

以上就是C++智能指针能管理数组吗 unique_ptr和shared_ptr对数组的支持的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号