1. 内存分区模型
C++程序内存4个区:
- 代码区:函数体的二进制代码
- 全局区:全局变量、静态变量和常量
- 栈区:函数参数、局部变量。编译器分配。
- 堆区:程序员分配和释放。若不释放,程序结束后操作系统回收。
内存四区意义:
不同的生命周期,更灵活。
1.1 程序运行前
程序编译后,生成exe可执行程序,在执行程序前,已经有代码区、全局区。
代码区:
存放CPU执行的机器指令
- 代码区是共享的,因此频繁执行的程序,只要在内存里存一份。
- 代码区是只读的,避免程序被意外修改。
全局区:
存放全局变量、静态变量和字符串常量、全局常量。
该区域数据由操作系统控制。
函数体外的是全局变量。
static修饰的是静态变量:
static int s_a = 0;
常量有字符串常量(
"hello"
),const修饰的全局变量(
const int c_a = 10;
)。
1.3 程序运行后
栈区:
编译器分配,存放函数参数、局部变量等
注意:不要返回局部变量地址,因为栈区地址由编译器控制。
错误示范:
int * func() {
int a = 10;
return &a;
}
int main() {
int *p = func();
cout<< *p << endl;
cout<< *p << endl;
}
1.3 new 操作符
int * arr = new int[10];
for (int i=0; i < 10; i++){
arr[i] = i + 100;
}
int * func() {
int * p = new int(10);
return p;
}
int main() {
int *p = func();
cout<< *p << endl;
cout<< *p << endl;
}