了解C/C++中关于内存的 代码区、全局区、栈区、堆区

目录

前言

一、代码区

二、全局区  

三、栈区

四、堆区 

总结


前言

在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(释放数组)。


总结

        代码区和全局区是在程序执行前存在的,栈区和堆区反之。全局区的数据由操作系统自行释放,栈区数据由编译器分配和释放,堆区数据由程序员分配和释放。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值