C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理
什么是动态数组?
动态数组与普通数组相似,但其大小可在程序运行时修改。动态数组元素占据连续内存块。
普通数组一经创建大小固定不可变。而动态数组即便填满后仍可扩展。创建普通数组时分配预定内存,动态数组则在需要时按一定因子增长内存。
本教程你将学到:
- 动态数组的概念
- 影响动态数组性能的因素
new关键字用法- 动态分配数组的初始化
- 数组扩容
- 动态删除数组
影响动态数组性能的因素
数组的初始大小和增长因子决定性能。注意:
- 初始大小小且增长因子小 → 频繁重新分配内存 → 性能下降。
- 初始大小大且增长因子大 → 大量闲置内存 → 扩容操作耗时长 → 性能下降。
new 关键字
C++ 中用 new 关键字创建动态数组。方括号内指定分配项数,前面是类型名。将分配请求数量的项,并返回指向首项的指针。创建后可用 delete 释放。
语法
pointer_variable = new data_type;
pointer_variable 为指针变量名。data_type 必须是合法 C++ 数据类型。
示例 1:运行时指定大小的动态数组
#include<iostream> using namespace std; int main() { int x, n; cout << "Enter the number of items:" << "\n"; cin >>n; int *arr = new int(n); cout << "Enter " << n << " items" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You entered: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } return 0; }
输出:

代码截图:

代码解释:(此处省略逐行解释,核心逻辑为:读取用户指定的 n,动态分配 int 数组,循环读入 n 个元素,再循环输出。)
注意: 上例允许用户运行时指定任意数组大小,即数组大小在运行时确定。
初始化动态分配数组
将动态数组初始化为 0 很容易。
语法:
int *array{ new int[length]{} };
length 为元素个数。因初始化为 0,初始化列表留空。
也可用初始化列表初始化动态数组。示例:
示例 2:使用初始化列表
#include <iostream> using namespace std; int main(void) { int x; int *array{ new int[5]{ 10, 7, 15, 3, 11 } }; cout << "Array elements: " << endl; for (x = 0; x < 5; x++) { cout << array[x] << endl; } return 0; }
输出:

代码截图:

数组扩容
动态数组长度在分配时确定。C++ 无内置机制在分配后调整数组大小。可通过分配新数组、拷贝元素、删除旧数组来变通,但此技术易出错,建议避免。
动态删除数组
动态数组用完后应从内存释放。delete 语句可完成此事。释放的内存可复用。即使不手动删除,程序结束时也会自动回收。
注意:
删除动态数组必须用 delete[] 而非 delete。[] 告诉 CPU 删除多个变量而非单个。对数组用 delete 而非 delete[] 会导致内存泄漏、数据损坏、崩溃等问题。
示例 3:完整的动态数组生命周期
#include<iostream> using namespace std; int main() { int x, n; cout << "How many numbers will you type?" << "\n"; cin >>n; int *arr = new int(n); cout << "Enter " << n << " numbers" << endl; for (x = 0; x < n; x++) { cin >> arr[x]; } cout << "You typed: "; for (x = 0; x < n; x++) { cout << arr[x] << " "; } cout << endl; delete [] arr; return 0; }
输出:

代码截图:

总结
- 普通数组大小固定,声明后不可修改;内存大小编译期确定。
- 动态数组大小运行时可变;内存大小运行时确定。
- C++ 动态数组用
new关键字声明。 - 用方括号指定动态数组元素个数。
- 用完后用
delete释放内存。 - 释放数组内存必须用
delete[];delete仅释放单个元素。 - C++ 无内置数组扩容机制。
- 用列表初始化数组时不使用
=运算符。
C语言
- 掌握 C# 数组:声明、初始化与核心操作完全指南
- C++数组传递给函数实战指南
- C语言动态内存分配完全指南:malloc、calloc、realloc 与 free
- C++ 数组完全指南:声明、初始化、多维数组与指针技巧
- C++ 运算符全解析:类型、示例与示例程序
- 掌握 C++ switch-case:语法、用法与实战示例
- C++ 结构体详解:定义、初始化、指针、函数参数与局限性
- C++ std::map 完全指南:键值对容器、核心操作与实战代码
- 掌握 C++ std::list:语法、函数与实战示例
- C++ Struct 与 Class 核心差异、语法及最佳实践
- C++动态内存管理精要:栈与堆、new/delete、数组与对象分配实战
- Java 选择排序详解:核心原理、完整代码与步骤演示