0

0

C++智能指针能管理数组吗 unique_ptr和shared_ptr的特化版本

P粉602998670

P粉602998670

发布时间:2025-08-06 08:46:01

|

1489人浏览过

|

来源于php中文网

原创

c++++智能指针中unique_ptr原生支持数组管理,而shared_ptr需要自定义删除器。1. unique_ptr通过指定数组类型(如int[])实现数组管理,自动调用delete[]释放内存,推荐使用make_unique方式创建;2. shared_ptr需手动指定删除器(如lambda表达式或函数模板),以确保调用delete[];3. 实际开发中更推荐优先使用std::vector或std::array等容器代替裸数组,因其具备更好的安全性和易用性。

C++智能指针能管理数组吗 unique_ptr和shared_ptr的特化版本

C++智能指针确实可以用来管理数组,但并不是所有类型的智能指针都“默认”支持数组管理。其中

unique_ptr
shared_ptr
对数组的支持方式也略有不同。

C++智能指针能管理数组吗 unique_ptr和shared_ptr的特化版本

unique_ptr
原生支持数组管理

unique_ptr
是可以直接用于数组的,因为它有针对数组类型的特化版本。使用时只需在类型后面加上
[]
,就像用
new[]
分配数组一样:

C++智能指针能管理数组吗 unique_ptr和shared_ptr的特化版本
std::unique_ptr arr(new int[10]);

这样声明后,

arr
会自动调用
delete[]
来释放内存,而不是普通的
delete
,避免了未定义行为。

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

常见用法:

C++智能指针能管理数组吗 unique_ptr和shared_ptr的特化版本
  • 初始化方式要明确指定数组类型(
    int[]
  • 访问元素使用
    operator[]
  • 不支持拷贝构造和赋值,只能移动(move)

例如:

std::unique_ptr createArray() {
    return std::make_unique(5); // C++14 起支持 make_unique 数组
}

注意点:

  • 如果你不小心用了
    unique_ptr
    然后传入
    new int[10]
    ,那就会导致内存泄漏或崩溃,因为析构时会调用
    delete
    而不是
    delete[]
  • 使用
    make_unique(size)
    是更推荐的方式,它安全且简洁。

shared_ptr
管理数组需要自定义删除器

相比之下,

shared_ptr
并没有为数组提供专门的特化版本。如果你直接写:

std::shared_ptr ptr(new int[10]);

这会导致错误,因为默认情况下它会在析构时调用

delete
,而你应该使用
delete[]

超级简历WonderCV
超级简历WonderCV

免费求职简历模版下载制作,应届生职场人必备简历制作神器

下载

解决办法是手动指定删除器:

std::shared_ptr ptr(new int[10], [](int* p) { delete[] p; });

或者封装成一个函数模板:

template
using array_deleter = std::default_delete;

std::shared_ptr ptr(new int[10], array_deleter());

适用场景:

  • 需要多个智能指针共享同一个数组的所有权
  • 想避免手动管理生命周期,又需要动态数组
  • 可以配合
    std::vector
    替代方案考虑(如果不需要共享所有权)

为什么
unique_ptr
支持数组,而
shared_ptr
没有原生支持?

这是设计上的取舍:

  • unique_ptr
    更强调轻量、高效、资源专有性,因此标准库提供了数组特化来满足一些底层需求;
  • shared_ptr
    的设计初衷是通用性强,而数组管理相对较少被用于共享所有权的场景,所以没做专门支持;
  • 同时,C++ 推荐优先使用容器如
    std::vector
    std::array
    ,它们已经很好地解决了大多数数组问题。

实际建议:优先考虑容器代替裸数组

虽然智能指针能管理数组,但在现代 C++ 中,更推荐使用标准容器:

  • std::vector
    动态数组
  • std::array
    固定大小数组

它们自带内存管理、边界检查、迭代器等特性,比裸数组 + 智能指针组合更安全、易用。

比如:

auto vec = std::make_shared>(10);

这样就不需要自己处理数组的释放逻辑了。


基本上就这些。如果你确实需要管理裸数组,记住

unique_ptr
直接支持,
shared_ptr
需要加删除器;不过多数时候,用容器就够了。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

187

2025.11.08

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

266

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2023.12.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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