C++中动态数组指的是在程序运行时根据实际需求分配内存大小的数组,不需要在编译阶段就确定数组长度,能灵活应对数据量变化的场景。常见的定义方式有两种,分别是基于new关键字的原生动态数组和基于标准库vector容器的动态数组。

使用new关键字定义动态数组
new是C++中用于动态分配堆内存的操作符,通过它可以创建指定长度的数组,数组长度可以是运行时的变量。定义语法为:数据类型* 数组名 = new 数据类型[数组长度];,分配的内存需要手动通过delete[]释放,避免内存泄漏。
基本定义示例
下面的代码演示了使用new定义int类型动态数组,赋值后遍历输出,最后释放内存的完整流程:
#include <iostream>
using namespace std;
int main() {
int n;
cout << "请输入动态数组长度:";
cin >> n;
// 定义长度为n的int类型动态数组
int* arr = new int[n];
// 给数组元素赋值
for (int i = 0; i < n; i++) {
arr[i] = i * 2;
}
// 遍历输出数组元素
cout << "数组元素为:";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
// 释放动态数组内存,必须用delete[],不能用delete
delete[] arr;
arr = nullptr; // 避免野指针
return 0;
}
注意事项
- new分配动态数组时,数组长度可以是变量,但不能是负数,否则会抛出异常。
- 释放动态数组必须使用
delete[],如果使用delete只释放首元素内存,会导致剩余元素内存泄漏。 - 分配内存后建议判断指针是否为空,部分编译器在内存分配失败时会返回nullptr。
- 释放内存后将指针赋值为nullptr,避免后续误用野指针。
使用vector容器定义动态数组
vector是C++标准模板库(STL)中的动态数组容器,它会自动管理内存,不需要开发者手动分配和释放,使用起来更安全便捷。vector的长度可以动态增长,支持随机访问,是日常开发中最常用的动态数组实现方式。
基本定义示例
下面的代码演示了vector动态数组的定义、添加元素、遍历和常用操作:
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 定义空的int类型vector动态数组
vector<int> vec;
// 添加元素,vector会自动扩容
for (int i = 0; i < 5; i++) {
vec.push_back(i + 1);
}
// 也可以直接初始化指定元素
vector<int> vec2 = {10, 20, 30, 40};
// 遍历输出vec的元素
cout << "vec元素为:";
for (int i = 0; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;
// 使用范围for遍历vec2
cout << "vec2元素为:";
for (int num : vec2) {
cout << num << " ";
}
cout << endl;
// 获取vector当前元素个数
cout << "vec元素个数:" << vec.size() << endl;
return 0;
}
常用操作说明
| 操作 | 说明 |
|---|---|
| push_back(元素) | 向数组尾部添加一个元素,数组长度自动加1 |
| size() | 返回当前数组的元素个数 |
| empty() | 判断数组是否为空,为空返回true |
| resize(新长度) | 调整数组长度,若新长度大于原长度会补默认值 |
| clear() | 清空数组所有元素,长度变为0 |
两种方式的对比选择
如果是简单的临时动态数组场景,且能确保正确释放内存,可以使用new方式;如果是日常开发中的通用场景,优先选择vector,它的自动内存管理能减少很多出错概率。另外new方式分配的数组是原生指针,不支持很多容器类的便捷操作,而vector提供了丰富的成员函数,开发效率更高。
注意:如果动态数组需要跨作用域传递,使用vector比原生new数组更合适,因为vector遵循值语义,拷贝和传递时不需要额外处理内存问题,而原生new数组传递指针时需要额外考虑内存释放的责任归属。