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

C++的智能指针确实可以管理数组,但不是所有智能指针都“天生”支持数组,需要特别注意用法。
unique_ptr
和
shared_ptr
都能用来管理数组资源,但它们在处理数组时的行为和普通对象略有不同。

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

std::unique_ptr arr(new int[10]);
这样声明后,
unique_ptr
会使用数组版本的析构函数来释放内存(即自动调用
delete[]
而不是
delete
),避免了内存泄漏或未定义行为。
立即学习“C++免费学习笔记(深入)”;
使用建议:
如果你管理的是一个动态分配的数组,优先使用
unique_ptr
。不要试图用
unique_ptr
去管理数组,那样会导致错误释放(只调用
delete
)。可以配合
std::make_unique
来创建数组(C++14起支持):
auto arr = std::make_unique(10);
shared_ptr
shared_ptr
对数组的支持
shared_ptr
的默认构造并不知道你要管理的是数组类型,因此如果你直接传入数组指针,它不会自动调用
delete[]
,而是调用
delete
,这会导致未定义行为。

不过你可以通过自定义删除器的方式来解决这个问题:
std::shared_ptr arr(new int[10], [](int* p){ delete[] p; });
这样就能确保数组被正确释放。
使用技巧:
管理数组时必须手动提供删除器,否则有风险。删除器可以用 lambda、函数指针或者函数对象。如果你不小心漏掉了删除器,可能会引发崩溃或内存泄漏。也可以封装成模板函数简化重复代码:
templateusing array_deleter = std::default_delete;templatestd::shared_ptr make_array(size_t size) { return std::shared_ptr(new T[size], array_deleter());}
实际开发中怎么选?
在实际项目中,选择哪种智能指针管理数组,取决于你的需求:
如果只需要单个对象拥有数组资源,就用
unique_ptr
,简单安全。如果多个对象需要共享数组资源,那就用
shared_ptr
加上删除器。如果你不想自己管理数组,也可以考虑使用标准库容器如
std::vector
或
std::array
,它们本身就带有内存管理功能,更安全也更容易使用。
基本上就这些。智能指针对数组的支持不算复杂,但容易因为疏忽导致问题,特别是
shared_ptr
没配好删除器的情况。只要记住:
unique_ptr
天然支持数组
shared_ptr
需要自定义删除器
就不会踩坑了。
以上就是C++智能指针能管理数组吗 unique_ptr和shared_ptr对数组的支持的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1469254.html
微信扫一扫
支付宝扫一扫