计算机内存的堆(Heap)和栈(Stack)
栈(Stack)
栈是系统自动管理 的一块内存区域,特点是后进先出(LIFO)。
- 存放内容:局部变量、函数参数、返回地址等
- 分配方式:编译器自动分配和释放
- 大小:通常较小(一般几 MB)
- 速度:非常快,因为只是移动栈顶指针
比如你写一个函数:
cpp
void foo() {
int a = 10; // a 分配在栈上
char s[20]; // s 也分配在栈上
}
函数执行完毕后,a 和 s 会被自动释放。
堆(Heap)
堆是程序员手动管理的一块内存区域,大小不固定。
- 存放内容:动态分配的内存
- 分配方式 :程序员用
new/malloc申请,用delete/free释放 - 大小:较大(可达 GB 级别)
- 速度:比栈慢,因为需要查找空闲内存块
比如:
cpp
int *p = new int(10); // 在堆上分配一个 int
delete p; // 手动释放
如果忘了 delete,就会造成内存泄漏。
对比总结
| 特性 | 栈(Stack) | 堆(Heap) |
|---|---|---|
| 管理方式 | 编译器自动管理 | 程序员手动管理 |
| 分配速度 | 很快 | 较慢 |
| 大小 | 较小(几 MB) | 较大(可达 GB) |
| 存放内容 | 局部变量、函数参数 | 动态分配的数据 |
| 释放时机 | 函数结束自动释放 | 必须手动释放 |
| 碎片问题 | 无 | 频繁分配释放会产生碎片 |
cpp
string s; // s 对象本身在栈上
cin >> s; // s 内部的数据可能分配在堆上
string 这个变量本身在栈上,但它内部存储的字符串数据通常是在堆上动态分配的,这也是为什么 string 可以灵活地存储任意长度的字符串。