对比表格
| 特性 | 栈上数组 | 堆上数组 |
|---|---|---|
| 内存位置 | 栈内存 | 堆内存 |
| 声明方式 | int arr[10]; | int* arr = new int[10]; |
| 生命周期 | 所在作用域结束自动释放 | 需要手动delete[]释放 |
| 大小确定 | 编译时确定(必须是常量) | 运行时确定(可以是变量) |
| 性能 | 分配/释放速度快 | 分配/释放速度相对慢 |
| 大小限制 | 受栈大小限制(通常较小) | 受系统可用内存限制 |
| 灵活性 | 固定大小,无法调整 | 可动态调整大小 |
栈上数组
void stackExample() {
const int size = 5; // 必须是常量
int stackArr[size] = {1, 2, 3, 4, 5}; // 栈上数组
// 自动管理内存,函数结束时自动释放
// 无法改变大小:int newArr[10] = stackArr; // 错误!
}堆上数组
void heapExample() {
int size = 5; // 可以是变量
int* heapArr = new int[size]{1, 2, 3, 4, 5}; // 堆上数组
// 可以动态调整大小
int* newArr = new int[10];
for (int i = 0; i < size; i++) {
newArr[i] = heapArr[i];
}
delete[] heapArr; // 必须手动释放!
heapArr = newArr;
delete[] heapArr; // 最终释放内存
}推荐方式
优先使用std::vector,它结合了两者的优点:
#include <vector>
void modernExample() {
std::vector<int> vec = {1, 2, 3, 4, 5}; // 在堆上分配
vec.push_back(6); // 自动扩展
// 自动管理内存,无需手动delete
}总结
栈数组:速度快、自动管理、大小固定、适合小数组;
堆数组:灵活大小、手动管理、适合大数组或动态需求;
现代实践:优先使用std::vector,避免手动内存管理。

