C++中动态数组通过new在堆上分配内存,delete[]释放,大小可在运行时确定;需配对使用new[]与delete[],避免内存泄漏和未定义行为;推荐优先使用std::vector实现自动内存管理。

在C++中,动态数组是通过 new 和 delete 操作符在堆(heap)上分配和释放内存来实现的。相比静态数组,动态数组的大小可以在程序运行时确定,更加灵活。
1. 动态数组的定义(使用 new)
要定义一个动态数组,使用 new 数据类型[大小] 的语法:
int* arr = new int[n]; // 创建一个长度为 n 的整型动态数组
说明:
-
new int[n]在堆上分配能存储 n 个 int 类型数据的内存空间。 - 返回值是一个指向该内存块首地址的指针(即
int*类型)。 - n 可以是变量,也就是说数组大小可以是运行时决定的。
示例:
立即学习“C++免费学习笔记(深入)”;
#includeusing namespace std; int main() { int size; cout << "输入数组大小: "; cin >> size;
int* arr = new int[size]; // 动态分配数组 // 赋值 for (int i = 0; i zuojiankuohaophpcn size; ++i) { arr[i] = i * 2; } // 输出 for (int i = 0; i zuojiankuohaophpcn size; ++i) { cout zuojiankuohaophpcnzuojiankuohaophpcn arr[i] zuojiankuohaophpcnzuojiankuohaophpcn " "; } cout zuojiankuohaophpcnzuojiankuohaophpcn endl; delete[] arr; // 释放内存 return 0;}
2. 释放动态数组(使用 delete[])
使用完动态数组后,必须手动释放内存,避免内存泄漏。释放动态数组要用 delete[]:
delete[] arr; // 正确:释放整个数组
注意:
- 如果是单个对象用
new分配,用delete释放; - 如果是数组用
new[]分配,必须用delete[]释放。 - 忘记释放会导致内存泄漏。
- 重复释放或访问已释放的内存会导致未定义行为。
3. new 和 delete 的基本用法对比
分配单个变量:
int* p = new int; // 分配一个int *p = 10; delete p; // 释放
分配数组:
double* darr = new double[100]; // 分配100个double // ... 使用 ... delete[] darr; // 必须加 []
4. 常见错误与注意事项
- 忘记 delete[]:导致内存泄漏,程序运行越久占用内存越多。
- 使用 delete 而不是 delete[]:对数组使用 delete 会引发未定义行为。
- 访问越界:动态数组不会检查边界,越界访问可能破坏内存。
- 重复释放:释放后不要再调用 delete[],也不要再次使用指针。
- 释放后使用(悬空指针):释放后建议将指针设为 nullptr:
delete[] arr; arr = nullptr; // 避免悬空指针
5. 更推荐的方式:使用 std::vector
虽然 new/delete 是基础技能,但在现代C++中,更推荐使用 std::vector 来代替动态数组:
#includestd::vector vec(size); // 自动管理内存,支持动态扩容
优点:
- 自动释放内存,无需手动 delete。
- 支持范围检查(at 方法)。
- 可变长度,功能丰富(push_back、size 等)。
- 更安全,不易出错。
基本上就这些。掌握 new 和 delete 是理解C++内存管理的基础,但实际开发中优先考虑 vector 等标准容器。不复杂但容易忽略的是:配对使用 new[]/delete[],别忘了释放。











