程序的内存模型
内存分区模型
C++程序在执行时,将内存大致分为4个区域。
1.代码区:存放函数体的二进制代码,由操作系统进行管理。
2.全局区:存放全局变量和静态变量以及常量。
3.栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。
4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
代码区没有什么问题,就是存放代码的地方,而且由操作系统全权管理,和程序员没太大关系。
全局区,堆区和栈区询问的问题就比较多了,上次面试面试官就问到这些问题了(没学过,答的稀烂。。。)。
全局区,字如其名,存放全局变量和静态变量以及常量。全局变量好理解,静态变量和常量都有全局的关系,具体的联系和区别在于编译时,目前还没有了解到这些知识,先挖个坑。
栈区和堆区则经常用来对比,栈区由编译器全权负责,管理函数的形参,局部变量。(都是有自己局部生存周期,函数形参调用函数时自动分配栈区,函数返回后销毁,局部变量同理)。堆区则由程序员自己管理的区域,防止程序员最后忘记回收,若最后有剩余的操作系统会进行回收操作。
四个区存在的意义,方便对不同生命周期的数据进行专门管理,给予了编程的灵活性。
1.1程序运行前
在程序编译后,生成一个exe可执行程序,未执行该程序前分为两个区域。
为什么只有两个,因为没有运行,堆区和栈区都是根据指令(调用函数,局部定义和程序员自己申请堆区空间)来实时申请和释放的,编译后并没有这些分区。代码区不必多说,全局区则由于编译时扫描了一遍源程序所以已经能够分辨全局变量,静态变量和常量了。
代码区
存放CPU的机器指令。
代码区是共享且只读的,目的是对于频繁执行的程序,只需要在内存中存在一份即可,只读是防止程序在运行时修改自身。
全局区
全局区存放的变量有全局变量、静态变量和常量(字符串常量和全局常量)。
栈区
存放函数的参数以及局部变量,编译器管理和回收。切勿返回局部变量的地址,因为那块地址已经释放,已经没有权限了。
堆区
由程序员自己管理的区域,程序结束时,操作系统强制回收内存。
可以使用new和delete进行操作。用法如下:
new 数据类型(初值) //整个语句返回开辟的地址
delete 数据类型
举个例子
int* p = new int(10);
delete p;
数组比较特殊:
int* p = new int[10];
delepe[] p;