• 常用
  • 百度
  • google
  • 站内搜索

资讯

C++中智能指针管理动态数组与指针结合的技巧

  • 更新日期:2025-12-04
  • 查看次数:2863

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

C++如何在数组与指针中结合智能指针管理动态数组

在C++中,动态数组通常通过指针分配(如 new[]),但手动管理内存容易引发泄漏或访问越界。结合智能指针可以自动释放资源,提升安全性。标准库中的 std::unique_ptrstd::shared_ptr 都支持管理动态数组,但需正确使用语法。

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

std::unique_ptr 是独占式智能指针,适合生命周期明确的动态数组。关键是在模板参数中加入数组维度(通常是空的 []),并使用正确的删除器。

示例:

#include <memory>
#include <iostream>

int main() { // 声明管理 int 数组的 unique_ptr std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);

// 赋值
for (int i = 0; i &lt; 5; ++i) {
    arr[i] = i * 10;
}

// 访问元素
for (int i = 0; i &lt; 5; ++i) {
    std::cout &lt;&lt; arr[i] &lt;&lt; " ";
}
std::cout &lt;&lt; std::endl;

return 0; // 自动调用 delete[]

}

注意:必须写成 std::unique_ptr<T[]>,否则析构时会调用 delete 而非 delete[],导致未定义行为。

使用 std::shared_ptr 管理共享动态数组

std::shared_ptr 支持多个指针共享同一块数组资源,但默认删除器仍使用 delete,因此必须自定义删除器以调用 delete[]

示例:

#include <memory>
#include <iostream>

int main() { // 创建 shared_ptr 并指定删除器 std::shared_ptr<int> arr(new int[5], [](int* p) { delete[] p; });

for (int i = 0; i &lt; 5; ++i) {
    arr.get()[i] = i + 1;
}

std::cout &lt;&lt; "Array: ";
for (int i = 0; i &lt; 5; ++i) {
    std::cout &lt;&lt; arr.get()[i] &lt;&lt; " ";
}
std::cout &lt;&lt; std::endl;

return 0; // 引用计数归零后自动调用自定义删除器

}

说明:由于 std::shared_ptr<int[]> 语法不被标准支持,需用裸指针加删除器方式实现数组管理。

替代方案:优先使用 std::vector

对于大多数场景,std::vector 是比智能指针 + 动态数组更安全、更易用的选择。它自动管理内存,支持动态扩容,且接口丰富。

#include <vector>
#include <iostream>

int main() { std::vector<int> vec(5); for (int i = 0; i < 5; ++i) { vec[i] = i * 2; }

for (int val : vec) {
    std::cout &lt;&lt; val &lt;&lt; " ";
}
std::cout &lt;&lt; std::endl;

return 0;

}

建议:除非有特殊性能或接口要求,应优先使用 std::vector 而非原始数组或智能指针管理的数组。

基本上就这些。关键是区分 unique_ptr<T[]> 的内置支持和 shared_ptr 需要手动指定删除器。用好这些机制,就能在保留指针灵活性的同时避免内存问题。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken