内存分区模型
c++程序在执行的时候,将内存大方向分为四块区域.
代码区
:存放函数体的二进制代码,由操作系统管理.全局区
:存放全局变量和静态变量以及常量栈区
:由编译器自动分配,存放函数参数值,局部变量堆区
:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
内存四区存在的意义
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程.
程序运行前
在程序运行前,生成 exe 可执行程序. 未执行该程序前分为两个区域:
代码区
- 存放 cpu 执行机械指令.
- 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码就行.
- 代码区是只读的,使其只读的原因是防止程序意外修改了他的指令.
全局区
- 全局变量和静态变量存放在此.
- 全局区还包括常量区,字符串常量,和其他常量也存放在此.
- 该区域的数据在程序结束后由操作系统释放.
全局变量
设置在函数之外的变量。
静态变量
在局部变量之前加上 static。
常量
字符串常量
" "之间都字符串是字符串常量.
c++
cout << (int)& "hello world!" << endl;
就会输出这句字符串的地址.
const 修饰的变量
c++
const int c_a;
const 修饰的变量分为:
- const 修饰的全局变量
- const 修饰的局部变量 注意:const 修饰的局部变量不在全局区!!!!
栈区
由程序员分配和释放,存放函数数据、局部变量,若程序员不释放,程序结束时由操作系统回收. 注意事项:不要返回局部变量的地址,编译器会自动释放.
堆区
使用 new 开辟一段新内存:
c++
int *p = new int(10);
只要不主动删除,或者程序结束,内容都不会释放.
new 运算符
new 的语法
int *p = new int (10);
如果想释放,运用 delete。
在堆区利用 new 开辟一个数组
int *arr = new int [10];
释放数组的时候: delete[] arr;