C++中如何使用new关键字在堆上创建动态数组

C++中如何使用new关键字在堆上创建动态数组
最新回答
梦有一把锁

2026-10-30 10:03:11

在C++中,使用new关键字在堆上创建动态数组的完整方法如下:

一、一维动态数组的创建与使用
  1. 基本语法

    data_type* array = new data_type[size];

    data_type:数组元素类型(如int、double等)。

    size:数组长度(可为变量或表达式,运行时确定)。

    示例:int n = 10;int* arr = new int[n]; // 创建长度为10的int数组

  2. 访问与修改元素

    通过下标访问,索引从0开始:arr[0] = 100; // 修改第一个元素arr[1] = 200; // 修改第二个元素

  3. 初始化动态数组

    C++11起支持初始化列表:double* darr = new double[3]{1.1, 2.2, 3.3}; // 初始化前3个元素

    初始化为0:使用空括号():int* zeros = new int[5](); // 所有元素初始化为0

  4. 释放内存

    必须使用delete[]释放new[]分配的数组,避免内存泄漏:delete[] arr;arr = nullptr; // 避免悬空指针

    注意:误用delete(非delete[])会导致未定义行为。

二、二维动态数组的创建与释放
  1. 创建步骤

    第一步:创建指针数组(行指针):int rows = 3, cols = 4;int matrix = new int*[rows]; // 创建3行的指针数组

    第二步:为每行分配空间:for (int i = 0; i < rows; ++i) { matrix[i] = new int[cols]; // 每行分配4列}

  2. 访问元素

    通过双重下标访问:matrix[1][2] = 5; // 修改第2行第3列的元素

  3. 释放内存

    反向操作:先释放每行,再释放指针数组:for (int i = 0; i < rows; ++i) { delete[] matrix[i]; // 释放每行}delete[] matrix; // 释放指针数组matrix = nullptr; // 避免悬空指针

三、关键注意事项
  1. 内存管理责任

    动态数组需手动释放,否则会导致内存泄漏。

    现代C++推荐使用std::vector或std::array(自动管理内存,更安全)。

  2. 异常安全

    若分配过程中抛出异常,可能导致内存泄漏。建议使用智能指针(如std::unique_ptr)或容器类。

  3. 性能考量

    动态数组分配可能比栈数组慢,且频繁分配/释放易产生内存碎片。

四、现代C++替代方案
  1. std::vector(动态大小)

    #include <vector>std::vector<int> vec(10); // 创建10个元素的vector,默认初始化为0vec.push_back(100); // 动态添加元素
  2. std::array(固定大小)

    #include <array>std::array<int, 5> arr = {1, 2, 3, 4, 5}; // 编译时确定大小

总结:new适用于需要手动控制内存的场景,但需严格管理释放逻辑。优先使用标准库容器可提升代码安全性和可维护性。