目录
前言
在C++的内存模型中有四个区用于存放不同的数据,分别是代码区、全局区、栈区和堆区。接下来让我们来了解一下这四个区的特点和用途。
一、代码区
在程序执行之前代码区就已经存在,代码区主要用于保存程序员所写的代码(二进制的机器执行指令)。代码区有共享和只读两个特点:
1.共享是表示在一个程序多次重复执行时无需多次重复读取,只需要在内存中有一份代码。
2.只读是表示防止程序执行后被意外修改指令(可理解为类似于防止游戏外挂修改游戏道具)。
二、全局区
在程序执行之前,全局区与代码区一同存在。全局区主要用于存放程序中的全局变量、静态变量,另外全局区内还包含一个常量区,常量区中包括字符串常量等一些常量。全局区的数据由操作系统在程序结束之后自行释放。
补充:静态变量如static int n=1;
在定义全局变量前加const也做常量(全局的常量)如const int n=1,全局常量在全局区内;
在定义局部变量前加const也做常量(局部的常量),局部常量不放在全局区内;
三、栈区
栈区与全局区不同的是栈区主要是用来存放局部变量和函数的参数,栈区的数据由编译器来开辟内存和自行释放。注意:不可以返回局部变量的地址。
int* zhan(){
int n=1;
return &n;//这里表示返回了局部变量的地址,实际中是错误的
}
四、堆区
堆区的数据由程序员管理操控和释放,最后由操作系统来回收。在C/C++中开辟内存的方法如下:
int* dui(){
int* n=new int(1);
return n;
}
使用new来开辟堆中的新内存; 指针本身在栈区,指针保存的数据在堆区。利用new创建的数据会返回相应数据类型的指针,释放操作符可以使用detele,如 detele n(释放单个数据)或detele【】n(释放数组)。
总结
代码区和全局区是在程序执行前存在的,栈区和堆区反之。全局区的数据由操作系统自行释放,栈区数据由编译器分配和释放,堆区数据由程序员分配和释放。