C++ 堆、栈、静态区:变量到底存在哪?
一、C++ 堆、栈、静态区:变量到底存在哪?
1、栈(Stack)
- 存储内容:主要用于存储函数的局部变量、函数参数、函数调用的返回地址等。每次函数调用时,系统会在栈上为其分配一块内存(称为'栈帧'),函数返回时自动释放。
- 管理方式:由编译器自动管理,遵循'后进先出'(LIFO)原则。分配和释放速度极快。
- 生命周期:与函数调用的生命周期绑定。局部变量在函数开始时分配,函数结束时销毁。
- 大小限制:通常有固定大小限制(由系统或编译器设置)。分配过大的局部变量(如超大数组)可能导致栈溢出(Stack Overflow)。
- 访问速度:访问速度快,因为内存地址通常是连续的,且靠近 CPU 寄存器。
示例:
void myFunction() {
int a = 10; // 局部变量 a 分配在栈上
double b = 3.14; // 局部变量 b 分配在栈上
} // 函数结束,a 和 b 自动销毁
2、堆(Heap)
- 存储内容:用于存储动态分配的内存。程序在运行时显式请求分配(如使用
new或malloc)和释放(如使用delete或free)的内存块。 - 管理方式:由程序员手动管理(或通过智能指针等机制辅助管理)。分配和释放相对较慢。
- 生命周期:从分配时刻开始,直到显式释放为止。如果忘记释放(内存泄漏),该内存会一直占用直到程序结束。
- 大小限制:通常受系统可用物理内存和虚拟内存的限制,比栈大得多。
- 访问速度:访问速度相对栈慢,因为需要通过指针间接访问,且内存可能不连续。
示例:
void dynamicAlloc() {
int* ptr = new int(100); // 在堆上分配一个 int,初始化为 100
// ... 使用 ptr ...
delete ptr; // 必须手动释放,否则内存泄漏
}



