对比表格
特性 | 栈上数组 | 堆上数组 |
---|---|---|
内存位置 | 栈内存 | 堆内存 |
声明方式 | 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,避免手动内存管理。