C++中的内存模型

内存分区模型
C++程序在执行时,将内存分为4个区域
1 代码区 存放函数的二进制代码 由操作系统进行管理的 放的是二进制
2 全局区 存放全局变量和静态常量及常量
3 栈区 由编译器自动分配释放 存放函数的参数值 局部变量等
4 堆区 由程序员分配和释放 若程序员不释放 程序结束时由操作系统回收
内存分四区意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程能力

代码区:存放的是exe可执行文件,存放cpu执行的机器指令
代码区是共享的:因为对于频繁执行的程序,只要在内存中有一份代码就行了
代码区是只读的,防止程序意外的修改了它的指令

全局区:包括常量区,字符串常量,和其他常量也存放在此
全局区的数据在系统结束后由操作系统释放
这里存放的是全局和静态常量及常量。使用代码举例:
int c = 10;
int d = 10;
int main()
{
int a = 10;
int b = 20;
cout << (int)&a << endl;
cout << (int)&b << endl;
cout << (int)&c << endl;
cout << (int)&d << endl;
static int e = 10;
static int f = 10;
cout << (int)&e << endl;
cout << (int)&f << endl;
return 0;
}
局部变量就是在main函数里面的,全局变量就是在main函数外面,静态常量,就是局部变量前面加了static,静态常量和全局变量在内存中存放的位置相近

常量
字符串常量,双引号引起来的常量,const修饰的常量
不在全局区的有:局部变量,const修饰的局部变量(局部常量)
全局区中有:全局变量,静态变量,static关键字,常量,字符串常量,const修饰的全局变量(全局常量),代码如下:
const int a = 10;
int main()
{
cout << (int)&“byte dance” << endl;
cout <<(int) &a << endl;
const int b = 0;
cout << (int) &b << endl;
return 0;
}
在输出函数前面加上int是把地址变成整数,方便查看,经过代码发现字符串常量的地址和全局区 静态变量的地址相近,const修饰的全局常量 和静态变量的地址相近,const修饰的局部变量 和局部变量地址相近

程序运行后,会有栈区
栈区:有编译器自动分配释放,存放函数的参数值,局部变量等,但是要注意:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放(在程序执行完之后自动释放),形参的数据也放在栈区。代码如下:
int* fun(int b)
{
b = 100;
int a = 10; 这里也是局部变量,因为在fun函数里面,在程序结束时由编译器自动销毁
return &a;
}
int main()
{
int* p=fun();
cout << *p << endl; 这里是10,但结果不应该是10,编译器认为这里可能是误操作,所以对结果做了保留
cout << *p << endl;第二次没保留,就不是10了,属于越界访问(非法访问内存)
return 0;
}

程序运行后,会有堆区,利用new关键字创建堆区,利用new关键字 可以将数据开辟到堆区
堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收,程序员释放是通过delete关键字来释放,在C++中主要利用new在堆区开辟内存,代码实现如下:
int* fun()
{
int* p = new int(10);//指针保持的数据是放在堆区 new是把堆区的地址给出来
return p;返回指针
}
int main()
{
int* p = fun();用指针来接收
cout << *p << endl;输出堆区的结果
delete p;通过delete关键字 来释放堆区的数据,把堆区的p释放
return 0;
}

在堆区利用new开辟数组,delete释放数组的时候要有一个[] 说明是数组 如果不加[] 的话就只会释放一个数据,释放数组的一个数据,而不是整个数组,代码如下:
void fun()
{
int* arr = new int[10];因为是中括号 说明创建了数组 数组由10个元素 因为返回的还是首元素地址
int a = 0;
for (a = 0; a < 10; a++)
{
arr[a] = a + 100;给10个元素赋值 值区间是 100-109
}
for (a = 0; a < 10; a++)
{
cout << arr[a] << endl;
}
delete[] arr;说明释放的是一个数组 数组叫arr
}
int main()
{
fun();
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lockey-s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值