C++系列-内存模型

内存模型

  • 内存模型四个区
  • 代码区
  • 全局区
  • 栈区
  • 堆区
    • 内存开辟和释放
      • 在堆区开辟数组

内存模型四个区

不同区域存放的数据生命周期是不同的,更为灵活。

  • 代码区:存放函数体的二进制代码,操作系统管理。
  • 全局区:存放全局变量,常量,静态变量。
  • 栈区:编译器自动分配释放,存放函数的参数值,局部变量等。
  • 堆区:由程序员分配和释放,如果不人为操作,则程序执行完之后由操作系统回收。

代码区

  • 在程序编译完,生成exe文件,未执行该程序前分为两个区域,代码区和全局区。
  • 代码区存放CPU执行的机器指令。
  • 代码区是共享的,对于频繁执行的程序,打开几次exe文件,执行的是同一块代码区。
  • 代码区的内容是只读的,防止程序意外的更改了指令。

全局区

  • 在程序执行前就存在。
  • 全局区的数据在程序执行完毕后,由操作系统释放。
  • 全局变量,静态变量存放在全局区。
  • 字符串常量和全局常量存放在全局区。
  • 局部常量不在。
code:#include<iostream>using namespace std;int G_a = 66;const int C_G_a = 88;void main(){static int S_a = 88;int a = 10, b = 30;const int C_a = 100;cout << "局部变量a的地址是:" << &a << endl;cout << "局部变量b的地址是:" << &b << endl;cout << "全局变量G_a的地址是:" << &G_a << endl;	cout << "静态变量S_a的地址是:" << &S_a << endl;cout << "字符串常量的地址是:" << &"hello" << endl;cout << "const全局变量C_G_a的地址是:" << &C_G_a << endl;cout << "const局部变量C_a的地址是:" << &C_a << endl;system("pause");}
result:临时变量a的地址是:00000024145FFC54临时变量b的地址是:00000024145FFC74全局变量G_a的地址是:00007FF7011EF050静态变量S_a的地址是:00007FF7011EF054C_a的地址是:00000024145FFCB4字符串常量的地址是:00007FF7011EBCA8str的地址是:00000024145FFC94

栈区

  • 编译器自动分配释放,存放函数的参数值,局部变量等。
  • 在函数中不要返回局部变量的地址。
在函数调用完后,局部变量存放于栈区,会由编译器释放,返回地址的话再引用这个地址可能已经被释放
#include<iostream>
using namespace std;
int G_a = 10;int* test()
{int a = 10;return &a;			// 返回了局部变量的地址,可能会出错
}void main()
{int* p = test();cout << *p << endl;		// 可能会出错cout << *p << endl;		p = test();system("pause");
}

堆区

  • 由程序员分配和释放,如果不人为操作,则程序执行完之后由操作系统回收。
  • 主要利用new在堆区开辟内存。
    在这里插入图片描述
p本身也是局部变量,但是其存放的数据在堆区
code:#include<iostream>using namespace std;int* test(){int *p = new int(10);cout << "p指向的地址是:" << p << endl;return p;}void main(){int* p1 = test();cout << *p1 << endl;cout << *p1 << endl;cout << "p1指向的地址是:" << p1 << endl;delete p1;//cout << *p1 << endl;		//会报错,因为该地址已经被释放system("pause");}
result:p指向的地址是:000002A94D3560901010p1指向的地址是:000002A94D356090

内存开辟和释放

  • new开辟,delete释放
  • 类型*p = new 类型(初始值) ,前后类型要一致
  • delete[] p

在堆区开辟数组

  • new 类型[数组元素个数], 返回的是连续空间的首地址。
#include<iostream>
using namespace std;void test()
{int *array = new int[5];for (int i = 0; i < 5; i++){array[i] = i;}for (int i = 0; i < 5; i++){cout << array[i] << endl;}delete[] array;//cout << array[0] << endl;		//报错
}void main()
{test();system("pause");
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AutoSAR配置与实践(基础篇)2.5 RTE对数据一致性的管理

传送门 点击返回 ->AUTOSAR配置与实践总目录 AutoSAR配置与实践&#xff08;基础篇&#xff09;2.5 RTE对数据一致性的管理 一、 数据一致性问题引入二、 数据一致性的管理2.1 RTE管理 (SWC间)2.2 中断保护 (SWC内)2.3 变量保护IRVS (SWC内)2.4 Task分配2.5 任务抢占控制 一…

44、TCP报文(二)

接上节内容&#xff0c;本节我们继续TCP报文首部字段含义的学习。上节为止我们学习到“数据偏移”和“保留”字段。接下来我们学习后面的一些字段&#xff08;暂不包含“检验和”的计算方法和选项字段&#xff09;。 TCP首部结构&#xff08;续&#xff09; “数据偏移”和“保…

525. 连续数组

525. 连续数组 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 525. 连续数组 https://leetcode.cn/problems/contiguous-array/description/ 完成情况&#xff1a; 解题思路&#xff1a; 参考代码&#xff1a; …

解放数据库,实时数据同步利器:Alibaba Canal

文章首发地址 Canal是一个开源的数据库增量订阅&消费组件&#xff0c;主要用于实时数据同步和数据订阅的场景&#xff0c;特别适用于构建分布式系统、数据仓库、缓存更新等应用。它支持MySQL、阿里云RDS等主流数据库&#xff0c;能够实时捕获数据库的增删改操作&#xff…

JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)

1.如何判断对象可以回收 1.1引用计数法 只要一个对象被其他对象所引用&#xff0c;就要让该对象的技术加1&#xff0c;某个对象不再引用其&#xff0c;则让它计数减1。当计数变为0时就可以作为垃圾被回收。 有一个弊端叫做循环引用&#xff0c;两个的引用计数都是1&#xff…

如何用树莓派Pico针对IoT编程?

目录 一、Raspberry Pi Pico 系列和功能 二、Raspberry Pi Pico 的替代方案 三、对 Raspberry Pi Pico 进行编程 硬件 软件 第 1 步&#xff1a;连接计算机 第 2 步&#xff1a;在 Pico 上安装 MicroPython 第 3 步&#xff1a;为 Thonny 设置解释器 第 4 步&#xff…

【ARM-Linux】项目,语音刷抖音项目

文章目录 所需器材装备操作SU-03T语音模块配置代码&#xff08;没有用wiring库&#xff0c;自己实现串口通信&#xff09;结束 所需器材 可以百度了解以下器材 orangepi-zero2全志开发板 su-03T语音识别模块 USB-TTL模块 一个安卓手机 一根可以传输的数据线 装备操作 安…

高项4.项目管理核心技术.

第一部分 项目管理概论 价值驱动的项目管理知识体系: 十二项原则;生命周期四个阶段;五个过程组;十大PM知识领域;八大绩效域;外加价值交付系统; 自1987 年以来, PMBOK 一直是基于过程的项目管理标准的重要代表,项目管理从业者一 直坚持基于过程的项目管理方法。随着…

2023-8-20 单链表

题目链接&#xff1a;单链表 #include <iostream>using namespace std;const int N 100010;int head, e[N], ne[N], idx;void init() {head -1;idx 0; }// 将x插入到头结点 void add_to_head(int x) {e[idx] x;ne[idx] head;head idx;idx; }// 将x插入到下标k后面…

VGG分类实战:猫狗分类

关于数据集 数据集选择的是Kaggle上的Cat and Dog&#xff0c;猫狗图片数量上达到了上万张。你可以通过这里进入Kaggle下载数据集Cat and Dog | Kaggle。 在我的Github仓库当中也放了猫狗图片各666张。 VGG网络 VGG的主要特点是使用了一系列具有相同尺寸 3x3 大小的卷积核进…

Android glide框架及框架涉及到的设计模式

目录 原文链接Android glide框架 简单使用介绍Glide 框架整体结构设计Glide 框架的优点基本使用&#xff1a;Glide占位符 Android glide框架涉及到的设计模式 原文链接 Android glide框架 简单使用介绍 Glide&#xff1a;快速高效的Android图片加载库&#xff0c;可以自动加载…

LLM低成本微调方法

LLM日益流行&#xff0c;已经渗透到各个领域&#xff0c;比如生物医学&#xff0c;但是模型的规模导致微调LLM对普通用户不够友好&#xff0c;因此&#xff0c;我们需要借助一些低成本方法&#xff0c;通过更新少量参数也达到与LLM全参数更新一样的效果。这里介绍三种主流方法&…

改善神经网络——优化算法(mini-batch、动量梯度下降法、Adam优化算法)

改善神经网络——优化算法 梯度下降Mini-batch 梯度下降&#xff08;Mini-batch Gradient Descent&#xff09;指数加权平均包含动量的梯度下降RMSprop算法Adam算法 优化算法可以使神经网络运行的更快&#xff0c;机器学习的应用是一个高度依赖经验的过程&#xff0c;伴随着大量…

解锁Spring AOP的神秘面纱

目录 Spring AOP的组成组成部分与常用注解举例理解 Spring AOP的实现添加 Spring AOP 框架⽀持定义切⾯和切点定义通知切点表达式说明 Spring AOP 实现原理JDK动态代理CGLIB动态代理 Spring AOP作为Spring框架的核心模块&#xff0c;为我们提供了一种优雅的方式来处理横切关注点…

版本控制工具Git集成IDEA的学习笔记(第一篇Gitee)

目录 一、Gitee的使用 1、注册网站会员 2、用户中心 3、创建远程仓库 4、配置SSH免密登录 二、集成IDEA&#xff0c;Git项目搭建 1、本地仓库搭建 1&#xff09;创建一个新项目 2&#xff09;打开终端&#xff0c;在当前目录新建一个Git代码库 3&#xff09;忽略文件 …

3. 爬取自己CSDN博客列表(自动方式)(分页查询)(网站反爬虫策略,需要在代码中添加合适的请求头User-Agent,否则response返回空)

文章目录 步骤打开谷歌浏览器输入网址按F12进入调试界面点击网络&#xff0c;清除历史消息按F5刷新页面找到接口&#xff08;community/home-api/v1/get-business-list&#xff09;接口解读 撰写代码获取博客列表先明确返回信息格式json字段解读 Apipost测试接口编写python代码…

03_缓存双写一致性

03——缓存双写一致性 一、缓存双写一致性 如果redis中有数据&#xff0c;需要和数据库中的值相同如果redis中无数据&#xff0c;数据库中的值要是最新值&#xff0c;且准备回写redis 缓存按照操作来分&#xff0c;可以分为两种&#xff1a; 只读缓存 读写缓存 同步直写操作…

【NX】NX二次开发BlockUI集列表的详细使用步骤

最近使用NX二次开发&#xff0c;需要用到集列表&#xff0c;也就是SetList这个控件&#xff0c;然而网上相关的资料和范例实在是太少&#xff0c;有幸找到《NX二次开发-BlockUI集列表的使用技巧》和《UG&#xff08;NX&#xff09;二次开发 BlockUI 集列表使用方法》&#xff0…

K8S deployment挂载

Deployment部署文件 apiVersion: apps/v1 kind: Deployment metadata:annotations:deployment.kubernetes.io/revision: "1"kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"apps/v1","kind":"Deployment&qu…

Redis从基础到进阶篇(一)

目录 一、了解NoSql 1.1 什么是Nosql 1.2 为什么要使用NoSql 1.3 NoSql数据库的优势 1.4 常见的NoSql产品 1.5 各产品的区别 二、Redis介绍 2.1什么是Redis 2.2 Redis优势 2.3 Redis应用场景 2.4 Redis下载 三、Linux下安装Redis 3.1 环境准备 3.2 Redis的…