c++程序执行时,有如下图的4个区域
代码区,存放函数体的二进制代码,由操作系统管理
全局区,存放全局变量和静态变量、常量(大部分)
栈区,编译器自动分配释放,存放函数的参数及局部变量
堆区,程序员分配和释放,若程序员不释放,则程序结束操作系统回收
1不同的区域,关联不同的生命周期
程序运行前
程序编译后生成可执行exe程序,未双击或ide点运行前,分为2个区域(即未点击运行但是经过编译就已经在内存中有了):
代码区:存放cpu执行的机器指令(函数代码被翻译成二进制指令),代码区是共享的,因为对于频繁访问的方法,只要一个区域即可,代码区又是只读的,防止程序意外修改了内容(即执行指令)
常量区:存放全局变量,静态变量,和常量的部分
2如上,我们展示了局部变量和全局静态变量,可以看到局部的是1992开头(为了展示地址我们都int转换了),而全局和静态可以看到是714开头的,这里我们没有细讲全局和静态,只是全局变量是定义在方法外的,静态是局部变量加上static关键字
3为什么我们说常量区是部分常量呢,可以看如上,我们比如创建个字符串,那其就是个字符串常量,我们也可以局部变量加const修饰,可以看到结果const修饰的局部常量和局部变量是在一个区域,并不在常量区
4当然还有const修饰的全局常量,也是在常量区的
程序运行时
点击运行后,程序会把参数和局部变量存到栈区,注意不要让函数返回地址,因为编译器可能会释放开辟的空间,因此不建议方法返回局部变量的地址
如果想将编译器不释放空间,需要使用堆区,方法为new
5如上,我们可以new对象,这里定义方法和之前的不一样,是使用int(10),new这里就将10给堆空间,同时方法返回的就是指针,可以左侧int *接收,而且这部分不会被编译器自动释放的危险,仅由程序员控制或者程序结束操作系统释放
new方法
我们刚才讲了new方法可以讲内存堆空间开辟区域,但是这段释放需要程序员控制,释放的关键字对应的是delete
6如上,我们定义了指针指向堆空间new出来的区域,但是我们delete释放掉后,p就无法解引用了。
7同样,我们也可以在堆区开辟数组空间,如上,这里就使用new 数据类型[]即可,我们因为p指向了数组,所以p就和数组名一样,可以使用索引来访问元素,如果想delete删除,我们需要加[],因为是释放数组空间,如果不加则识别为释放一个元素的空间
最后说下堆区和栈区的意义,内存的栈区读写速度快,但是空间小,堆区空间大但是速度慢(new,delete),new将引用指向堆区防止变量存在栈区释放溢出,局部变量引用失效这样的情况出现
网友评论