C++中动态数组可用std::unique_ptr或std::shared_ptr配合自定义删除器管理,前者自动调用delete[],后者需显式指定删除器;但推荐优先使用std::vector,因其更安全易用。

在C++中,动态数组通常通过指针分配(如
new[]
),但手动管理内存容易引发泄漏或访问越界。结合智能指针可以自动释放资源,提升安全性。标准库中的
std::unique_ptr
和
std::shared_ptr
都支持管理动态数组,但需正确使用语法。
使用 std::unique_ptr 管理动态数组
std::unique_ptr
是独占式智能指针,适合生命周期明确的动态数组。关键是在模板参数中加入数组维度(通常是空的
[]
),并使用正确的删除器。
示例:
#include #includeint main() {// 声明管理 int 数组的 unique_ptrstd::unique_ptr arr = std::make_unique(5);
// 赋值for (int i = 0; i < 5; ++i) { arr[i] = i * 10;}// 访问元素for (int i = 0; i < 5; ++i) { std::cout << arr[i] << " ";}std::cout << std::endl;return 0; // 自动调用 delete[]
}
注意:必须写成
std::unique_ptr
,否则析构时会调用
delete
而非
delete[]
,导致未定义行为。
使用 std::shared_ptr 管理共享动态数组
std::shared_ptr
支持多个指针共享同一块数组资源,但默认删除器仍使用
delete
,因此必须自定义删除器以调用
delete[]
。
立即学习“C++免费学习笔记(深入)”;
示例:
#include #includeint main() {// 创建 shared_ptr 并指定删除器std::shared_ptr arr(new int[5], [](int* p) {delete[] p;});
for (int i = 0; i < 5; ++i) { arr.get()[i] = i + 1;}std::cout << "Array: ";for (int i = 0; i < 5; ++i) { std::cout << arr.get()[i] << " ";}std::cout << std::endl;return 0; // 引用计数归零后自动调用自定义删除器
}
说明:由于
std::shared_ptr
语法不被标准支持,需用裸指针加删除器方式实现数组管理。
替代方案:优先使用 std::vector
对于大多数场景,
std::vector
是比智能指针 + 动态数组更安全、更易用的选择。它自动管理内存,支持动态扩容,且接口丰富。
#include #includeint main() {std::vector vec(5);for (int i = 0; i < 5; ++i) {vec[i] = i * 2;}
for (int val : vec) { std::cout << val << " ";}std::cout << std::endl;return 0;
}
建议:除非有特殊性能或接口要求,应优先使用
std::vector
而非原始数组或智能指针管理的数组。
基本上就这些。关键是区分
unique_ptr
的内置支持和
shared_ptr
需要手动指定删除器。用好这些机制,就能在保留指针灵活性的同时避免内存问题。
以上就是C++如何在数组与指针中结合智能指针管理动态数组的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1474840.html
微信扫一扫
支付宝扫一扫