C++ 核心编程 - 内存分区模型

文章目录

  • 1.1 程序运行前
  • 1.2 程序运行后
  • 1.3 new 操作符

C++ 程序在执行时,将内存大致划分为 4个区域

  • 代码区:存放函数体的二进制代码,由操作系统进行管理;
  • 全局区:存放全局变量和静态变量以及常量;
  • 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等;
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

内存四区意义: 不同区域存放不同的数据,赋予不同的生命周期, 给我们更大的灵活编程。

1.1 程序运行前

​ 在程序编译后,生成了 .exe 可执行程序,未执行该程序前分为两个区域:

(1)代码区: 存放 CPU 执行的机器指令

  • 共享,对于频繁被执行的程序,只需要在内存中有一份代码即可;

  • 只读,防止程序意外地修改了它的指令。

(2)全局区: 全局变量和静态变量存放在此,在程序结束后由操作系统释放

// Global variable
int g_a = 10;
int g_b = 10;

// Global constant
const int c_g_a = 10;
const int c_g_b = 10;

int main(){
    // Local variable
    int a = 10;
    int b = 10;

    // Static vaiiable
    static int c_a = 10;
    static int c_b = 10;

    cout << "Local variable => a: " << (long)&a << endl;
    cout << "Local variable => b: " << (long)&b << endl << endl;

    cout << "Global variable => g_a: " << (long)&g_a << endl;
    cout << "Global variable => g_b: " << (long)&g_b << endl << endl;

    cout << "Static variable => c_a: " << (long)&g_a << endl;
    cout << "Static variable => c_b: " << (long)&g_b << endl << endl;

    // String constant
    cout << "String constant => str:" << (long)&"Hello" << endl << endl;

    cout << "Global constant => c_g_a: " << (long)&c_g_a << endl;
    cout << "Global constant => c_g_a: " << (long)&c_g_b << endl << endl;

    // Local constant
    const int c_l_a = 10;
    const int c_l_b = 10;

    cout << "Local constant => c_l_a: " << (long)&c_l_a << endl;
    cout << "Local constant => c_l_a: " << (long)&c_l_b << endl << endl;

    return 0;
}
Local variable => a: 140737488345656 
Local variable => b: 140737488345660

Global variable => g_a: 93824992247824 
Global variable => g_b: 93824992247828

Static variable => c_a: 93824992247824
Static variable => c_b: 93824992247828

String constant => str:93824992239796 

Global constant => c_g_a: 93824992239620 
Global constant => c_g_a: 93824992239624

Local constant => c_l_a: 140737488345664 
Local constant => c_l_a: 140737488345668

在这里插入图片描述

1.2 程序运行后

(1)栈区: 由编译器自动分配释放, 存放函数的参数值(形参),局部变量等。

注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。

int *func(){
    int a = 10;
    return &a;
}

int main(){
    int *p = func();

    cout << *p << endl;
    cout << *p << endl;

    return 0;
}

使用 g++ main.cpp -o main 编译时,报出如下错误:

main.cpp: In function ‘int* func()’:
main.cpp:7:12: warning: address of local variable ‘a’ returned [-Wreturn-local-addr]
    7 |     return &a;
      |            ^~
main.cpp:6:9: note: declared here
    6 |     int a = 10;
      |         ^

(2)堆区: 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收。

在 C++ 中,其主要利用 new 在堆区中开辟内存。

int *func(){
    int *a = new int(10);
    return a;
}

int main(){
    int *p = func();

    cout << func() << endl;
    cout << *p << endl;

    return 0;
}
0x55555556aed0
10

1.3 new 操作符

​ C++ 中利用 new 操作符在堆区开辟数据,由程序员手动开辟、手动释放,释放时可利用操作符 delete

示例1:基本语法

int *func(){
    int *a = new int(10);
    return a;
}

int main(){
    int *p = func();

    cout << func() << endl;
    cout << *p << endl;

    delete p;
    // cout << *p << endl; // 为什么还是输出了?不应该报错吗?

    return 0;
}

示例1:开辟数组

int main(){
    int *arr = new int[10];

    for (int i = 0; i < 10; i++){
        arr[i] = i + 100;
    }

    for (int j = 0; j < 10; j++){
        cout << arr[j] << '\t';
    }

    delete[] arr;

    return 0;
}
100     101     102     103     104     105     106     107     108     109

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/572048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CSS】CSS实现元素逐渐消失(实现元素透明逐渐消失/模糊)

mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%);mask-image 属性用于定义一个遮罩&#xff0c;它可以隐藏元素的一部分或全部内容。在这个示例中&#xff0c;我们使用 mask-image 属性来定义一个线性渐变的遮罩&#xff0c;使得列表项的内…

nginx配置ip_hash负载均衡策略

一、nginx配置ip_hash负载均衡策略 nginx默认的负载均衡策略为轮询&#xff0c;某些场景需要使用ip_hash负载策略&#xff0c;即&#xff1a;同一个ip地址&#xff0c;永远访问nginx后面同一台tomcat。配置示例如下&#xff0c;主要是设置ip_hash&#xff1a; upstream www.ab…

机器视觉系统-工业光源什么是高角度光,以及发光角度得分类

光路描述&#xff1a;光线与水平面角度>45称为高角度光。 效果分析&#xff1a;高角度照射&#xff0c;光线经 被测物表面平整部分反射后进入镜头&#xff0c;图像效果表现为灰度值较高&#xff1b;不平整部分反射光进入不了镜头&#xff0c;图像效果表现为灰度值较低。 主要…

【Vue】自定义事件实现组件之间的通信(案例讲解)

一、前言 这是部分哔哩哔哩上跟着一个博主【遇见狂神说】学习的&#xff0c;当然自己也是才开始学习的vue&#xff0c;在学到这个Vue的自定义事件的时候&#xff0c;虽然知识点很绕&#xff0c;但是在理解后又觉得很意思&#xff0c;觉得Vue真的很强大。这里博主将自己学习到的…

2、选择什么样的机器人本体

如果说世界是物质的&#xff0c;那么应该先制造出机器人的本体&#xff0c;再让她产生灵魂。如果是精神的呢&#xff0c;世界是无中生有的呢&#xff0c;那就先在仿真中研究算法吧。 而我比较崇尚初中哲学的一句话&#xff0c;世界是物质的&#xff0c;物质是运动的&am…

[已测试]TVBox二次开发影视系统酷点1.4.4反编译版本

支持p2p, 磁力等播放 支持多仓切换vip线路 自动换源开关 启动时直接进入直播 原始轮播图和幻灯片切换 加大防抓包的可能性 支持安卓4.x版本 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89084105 更多资源下载&#xff1a;关注我。

科技改变视听4K 120HZ高刷新率的投影、电视、电影终有用武之地

早在1888年&#xff0c;法国生理学家埃蒂安朱尔马莱就发明了一套盒式摄像机&#xff0c;能以120帧/s的速度在一条纸膜上曝光照片&#xff0c;但是当时没有相匹配的放映设备。而马莱的另一套拍摄设备是60帧/s的规格&#xff0c;并且图像质量非常好。 受此启发&#xff0c;雷诺的…

CobaltStrike使用插件实现免杀

免责声明&#xff1a;本工具仅供安全研究和教学目的使用&#xff0c;用户须自行承担因使用该工具而引起的一切法律及相关责任。作者概不对任何法律责任承担责任&#xff0c;且保留随时中止、修改或终止本工具的权利。使用者应当遵循当地法律法规&#xff0c;并理解并同意本声明…

编译一个基于debian/ubuntu,centos,arhlinux第三方系统的问题解答

如果是开机卡boot注意看前面几行会有错误提示&#xff0c;一般会比较好找&#xff0c;下面是过了kernel内核加载后出现的问题 目录 上一篇文章 第一个问题 错误原因 解决办法 第二个问题 注意 第三个问题 上一篇文章 编译一个基于debian/ubuntu,centos,arhlinux第三方系…

【Linux网络】FTP服务

目录 一、FTP简介 1.FTP-文件传输协议 2.FTP的两种模式 二、安装配置FTP 1.安装环境 2.对文件的操作 3.切换目录 4.设置匿名用户 5.图形化界面登录 6.白名单与黑名单 重点与难点 一、FTP简介 1.FTP-文件传输协议 FTP是FileTransferProtocol&#xff08;文件传输协…

(十) 盘古UI,详情小标题副标题的实现,方便快速开发详情PanguFormTitle!

(十) 盘古UI,详情小标题副标题的实现,方便快速开发详情PanguFormTitle! 盘古UI,较为全面的自定义UI框架,帮助你绝对的快速开发!(长期维护中) 控件位置: com.smart.pangu_ui_lib.widget.PanguFormTitle demo地址,点击查看github 详情|表单的小标题 可以在详情或者表单的页面…

MapMagic 2 Biomes and Functions

MapMagic 2(免费)世界生成器官方模块。支持基于遮罩混合几个图形,从而可以在无限地形上混合不同的生物群落。也随附函数节点,从而可以在子图中执行复杂的生成过程。将它们视作含有输入和输出连接器的生物群落。请注意,必须使用 MapMagic 2 的现有安装才能使用该模块。 下…

护眼台灯哪个牌子最好?消费者信赖之选护眼灯十大品牌推荐

孩子入学后&#xff0c;对其的关注和照料必须加倍。特别是眼睛的健康&#xff0c;在学习过程中显得尤为关键。为了减轻孩子的眼睛疲劳&#xff0c;降低近视的风险&#xff0c;选择一款优质的护眼台灯至关重要。护眼台灯哪个牌子最好&#xff1f;目前市场上书客、飞利浦、松下等…

微信小程序中,plugins 配置项如何配置

在微信小程序中&#xff0c;plugins 配置项用于声明小程序需要使用的第三方插件。以下是如何配置 plugins 的基本步骤&#xff1a; 获取插件的AppID和版本信息&#xff1a; 首先&#xff0c;你需要在微信开放平台或微信公众平台上找到你需要的插件&#xff0c;并获取其AppID和版…

【漏洞复现】泛微e-office系统ajax.php接口存在任意文件上传漏洞

漏洞描述 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软件。泛微 E-Office 9.5版本存在代码问题漏洞,泛微e-office系统ajax.php接口存在任意文件上传漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,…

大模型推理优化之 KV Cache

原文&#xff1a;https://zhuanlan.zhihu.com/p/677660376 目录 收起 KV Cache 定义 KV Cache 原理 KV Cache 实现 KV Cache 显存占用分析 KV Cache 优化方法 在语言模型推理的过程中&#xff0c;性能优化一直是一个备受关注的话题。LLM&#xff08;Large Language Mode…

基于stm32的UART高效接收DMA+IDLE编程示例

目录 基于stm32的UART高效接收DMAIDLE编程示例实验目的场景使用原理图UART的三种编程方式IDLE程序设计串口配置配置中断配置DMA代码片段本文中使用的测试工程 基于stm32的UART高效接收DMAIDLE编程示例 本文目标&#xff1a;基于stm32_h5的freertos编程示例 按照本文的描述&am…

训练营第三十三天贪心(第五部分重叠区间问题)

训练营第三十三天贪心&#xff08;第五部分重叠区间问题&#xff09; 435.无重叠区间 力扣题目链接 题目 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: …

MySQL多版本并发控制mvcc原理浅析

文章目录 1.mvcc简介1.1mvcc定义1.2mvcc解决的问题1.3当前读与快照读 2.mvcc原理2.1隐藏字段2.2版本链2.3ReadView2.4读视图生成原则 3.rc和rr隔离级别下mvcc的不同 1.mvcc简介 1.1mvcc定义 mvcc(Multi Version Concurrency Control)&#xff0c;多版本并发控制&#xff0c;是…

Kubeedge:Metamanager源码速读(不定期更新)

Kubeedge源码版本&#xff1a;v1.15.1 在看Metamanager之前&#xff0c;先看一下Metamanager源码的目录结构&#xff08;位于edge/pkg下&#xff09;和官方文档&#xff1a; 目录结构如下面的两张图所示。请忽略绿色的文件高亮&#xff0c;这是Jetbrains goland对未提交修改的…