亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理

什么是动态数组?

动态数组与普通数组相似,但其大小可在程序运行时修改。动态数组元素占据连续内存块。

普通数组一经创建大小固定不可变。而动态数组即便填满后仍可扩展。创建普通数组时分配预定内存,动态数组则在需要时按一定因子增长内存。

本教程你将学到:

影响动态数组性能的因素

数组的初始大小和增长因子决定性能。注意:

  1. 初始大小小且增长因子小 → 频繁重新分配内存 → 性能下降。
  2. 初始大小大且增长因子大 → 大量闲置内存 → 扩容操作耗时长 → 性能下降。

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; } 

输出:

C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理

代码截图:

C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理

代码解释:(此处省略逐行解释,核心逻辑为:读取用户指定的 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++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理

代码截图:

C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理

数组扩容

动态数组长度在分配时确定。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、初始化、扩容与内存管理

代码截图:

C++ 动态数组分配实战指南:new/delete、初始化、扩容与内存管理

总结

C语言

  1. 掌握 C# 数组:声明、初始化与核心操作完全指南
  2. C++数组传递给函数实战指南
  3. C语言动态内存分配完全指南:malloc、calloc、realloc 与 free
  4. C++ 数组完全指南:声明、初始化、多维数组与指针技巧
  5. C++ 运算符全解析:类型、示例与示例程序
  6. 掌握 C++ switch-case:语法、用法与实战示例
  7. C++ 结构体详解:定义、初始化、指针、函数参数与局限性
  8. C++ std::map 完全指南:键值对容器、核心操作与实战代码
  9. 掌握 C++ std::list:语法、函数与实战示例
  10. C++ Struct 与 Class 核心差异、语法及最佳实践
  11. C++动态内存管理精要:栈与堆、new/delete、数组与对象分配实战
  12. Java 选择排序详解:核心原理、完整代码与步骤演示