C++ 内存分区学习笔记
1. 栈区(Stack)
- 作用:用于存储函数的局部变量、函数参数和函数调用信息。
- 特点:分配和释放由编译器自动管理,遵循“后进先出”的原则。
- 生命周期:在函数调用时分配内存,在函数返回时自动释放。
示例代码:
void foo() {
int x = 5; // x 在栈上分配内存
} // 函数返回时,x 在栈上自动释放内存
2. 堆区(Heap)
- 作用:用于动态分配内存,存储程序运行期间动态创建的对象和数据。
- 特点:分配和释放由程序员手动管理,需要使用
new
和delete
关键字。 - 生命周期:需要手动分配和释放内存,直到调用
delete
手动释放内存。
示例代码:
int* ptr = new int; // 在堆上分配内存
*ptr = 10;
delete ptr; // 释放堆上的内存
3. 全局区/静态区(Static/Data)
- 作用:用于存储全局变量、静态变量和常量。
- 特点:在程序运行期间始终存在,直到程序结束才释放。
- 生命周期:全局变量和静态变量在程序启动时分配内存,直到程序结束时才释放。
示例代码:
int globalVariable; // 全局变量,在全局区分配内存
static int staticVariable; // 静态变量,在全局区分配内存
const int constantValue = 100; // 常量,在全局区分配内存
4. 文字常量区(Text/Code)
- 作用:存储程序的代码段,包括函数体、常量字符串等。
- 特点:只读,存储程序的执行代码。
- 生命周期:程序启动时分配内存,直到程序结束才释放。
示例代码:
void func() {
const char* message = "Hello"; // 常量字符串在文字常量区
}
通过理解这些内存分区的特点和用法,我们可以更好地管理程序的内存,并避免内存泄漏和不必要的内存浪费。