当前位置: 首页 > news >正文

C++内存模型

目录

一.内存分区

二,分区顺序

1 程序运行前

2 程序运行后

3.new操作符


一.内存分区

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

内存可以分为以下几个区:

  1. 代码区:存放函数体的二进制代码,由操作系统进行管理的

  2. 全局区:存放全局变量和静态变量以及常量

  3. 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等

  4. 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

二,分区顺序

1 程序运行前

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

代码区:

存放代码

代码区是共享的,共享的目的是对于频繁被执行的程序(多次双击exe),只需要在内存中有一份代码即可

代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区:

全局变量和静态变量存放在此.

全局区还包含了常量区, 字符串常量和其他常量也存放在此.

该区域的数据在程序结束后由操作系统释放

//全局变量
int g_a = 10;
int g_b = 10;//全局常量
const int c_g_a = 10;
const int c_g_b = 10;int main() {//局部变量int a = 10;int b = 10;//打印地址cout << "局部变量a地址为: " << (int)&a << endl;cout << "局部变量b地址为: " << (int)&b << endl;cout << "全局变量g_a地址为: " <<  (int)&g_a << endl;cout << "全局变量g_b地址为: " <<  (int)&g_b << endl;//静态变量static int s_a = 10;static int s_b = 10;cout << "静态变量s_a地址为: " << (int)&s_a << endl;cout << "静态变量s_b地址为: " << (int)&s_b << endl;cout << "字符串常量地址为: " << (int)&"hello world" << endl;cout << "字符串常量地址为: " << (int)&"hello world1" << endl;cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl;const int c_l_a = 10;const int c_l_b = 10;cout << "局部常量c_l_a地址为: " << (int)&c_l_a << endl;cout << "局部常量c_l_b地址为: " << (int)&c_l_b << endl;system("pause");return 0;
}

总结:

  • C++中在程序运行前分为全局区和代码区

  • 代码区特点是共享和只读

  • 全局区中存放全局变量、静态变量、常量

  • 常量区中存放 const修饰的全局常量 和 字符串常量

2 程序运行后

栈区:

由编译器自动分配释放, 存放函数的参数值,局部变量等

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

int * func()
{int a = 10;return &a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;system("pause");return 0;
}

堆区:

由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

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

int* func()
{int* a = new int(10);return a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;system("pause");return 0;
}

总结:

堆区数据由程序员管理开辟和释放

堆区数据利用new关键字进行开辟内存

3.new操作符

C++中利用==new==操作符在堆区开辟数据

堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 ==delete==

语法:new 数据类型

利用new创建的数据,会返回该数据对应的类型的指针

示例1: 基本语法

int* func()
{int* a = new int(10);return a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;//利用delete释放堆区数据delete p;//cout << *p << endl; //报错,释放的空间不可访问system("pause");return 0;
}

示例2:开辟数组

//堆区开辟数组
int main() {int* arr = new int[10];for (int i = 0; i < 10; i++){arr[i] = i + 100;}for (int i = 0; i < 10; i++){cout << arr[i] << endl;}//释放数组 delete 后加 []delete[] arr;system("pause");return 0;
}

相关文章:

C++内存模型

目录 一.内存分区 二,分区顺序 1 程序运行前 2 程序运行后 3.new操作符 一.内存分区 内存分区意义&#xff1a;不同区域存放的数据&#xff0c;赋予不同的生命周期, 给我们更大的灵活编程 内存可以分为以下几个区&#xff1a; 代码区&#xff1a;存放函数体的二进制代码…...

八股+面经

文章目录项目介绍Java基础MapHashMap v.s Hashtable(5点)ConcurrentHashMap v.s Hashtable(2点)代理模式1. 静态代理2. 动态代理2.1 JDK 动态代理机制2.2 CGLIB 动态代理机制Java并发线程volatilesynchronized线程池JVM类加载机制垃圾回收&#xff08;GC&#xff09;1. 引用类型…...

MySQL更新数据流程

1.mysql三种重要日志 redo log&#xff08;重做日志&#xff09;&#xff1a;存在于引擎层&#xff0c;物理存储&#xff0c;通过设置innodb_flush_log_at_trx_xommit1 让其持久化到磁盘&#xff0c;保证引擎的crash-safe能力&#xff0c;遵从WAL技术&#xff08;Write-Ahead …...

测试开发进阶系列课程

测试开发系列课程1.完善程序思维--------案列&#xff1a;图书管理系统的创建**&#xff08;一&#xff09;图书管理系统的创建**1.完善程序思维--------案列&#xff1a;图书管理系统的创建 &#xff08;一&#xff09;图书管理系统的创建 1.在main中写入主函数&#xff0c;…...

Qt源码阅读(三) 对象树管理

对象树管理 个人经验总结&#xff0c;如有错误或遗漏&#xff0c;欢迎各位大佬指正 &#x1f603; 文章目录对象树管理设置父对象的作用设置父对象(setParent)完整源码片段分析对象的删除夹带私货时间设置父对象的作用 众所周知&#xff0c;Qt中&#xff0c;有为对象设置父对象…...

【Python入门第四十二天】Python丨NumPy 数组裁切

裁切数组 python 中裁切的意思是将元素从一个给定的索引带到另一个给定的索引。 我们像这样传递切片而不是索引&#xff1a;[start&#xff1a;end]。 我们还可以定义步长&#xff0c;如下所示&#xff1a;[start&#xff1a;end&#xff1a;step]。 如果我们不传递 start&…...

Anaconda配置Python新版本tensorflow库(CPU、GPU通用)的方法

本文介绍在Anaconda环境中&#xff0c;下载并配置Python中机器学习、深度学习常用的新版tensorflow库的方法。 在之前的两篇文章基于Python TensorFlow Estimator的深度学习回归与分类代码——DNNRegressor&#xff08;https://blog.csdn.net/zhebushibiaoshifu/article/detail…...

加载模型时出现 OSError: Unable to load weights from pytorch checkpoint file 报错的解决

加载模型时出现 OSError: Unable to load weights from pytorch checkpoint file 报错的解决报错信息原因查明网传解决措施好消息我的解决措施报错信息 查了下&#xff0c;在网上还是个比较常见的报错 一般为加载某模型时突然报错 原因查明 一般为下载某个 XXX_model.bin 的…...

sessionStorage , localStorage 和cookie的区别

一.sessionStorage(临时存储)sessionStorage是HTML5中新增的Web Storage API之一&#xff0c;用于在浏览器中存储键值对数据&#xff0c;与localStorage类似&#xff0c;但是sessionStorage存储的数据在会话结束时会被清除。可以通过以下方式使用sessionStorage&#xff1a;存储…...

C# 实例详解委托之Func、Action、delegate

委托是.NET编程的精髓之一&#xff0c;在日常编程中经常用到&#xff0c;在C#中实现委托主要有Func、Action、delegate三种方式&#xff0c;这个文章主要就这三种委托的用法通过实例展开讲解。 【Func】&#xff1a;Func是带返回值的委托&#xff1a; 原型函数如下(以下展示的…...

如何选电脑

1、CPU&#xff08;中央处理器&#xff09; 怎么看CPU型号&#xff1a;CPU:系列-代数等级核心显卡型号电压后缀 例如CPU:i7-10750H &#xff1a; 1、系列&#xff1a;Intel的酷睿i3、i5、i7、i9这四个系列的CPU&#xff0c;数字越大就代表越高端。 2、代数&#xff1a;代表…...

SpringBoot项目创建

如果使用spring的源地址创建项目失败&#xff0c;就使用 阿里云的springBoot项目创建地址&#xff1a;https://start.aliyun.com/ 1.new 一个新的项目&#xff1a; 2.选择合适的版本java的JDK和maven项目 3.选择spring web依赖 4.直接finish 5. 删除无用的包&#xff0c;然后…...

神经衰弱该如何判断?确诊为神经衰弱,日常要做好这7大护理!

神经衰弱是由于长时间处于紧张或者压力的情况下导致精神出现兴奋或者疲乏现象而伴随着一系列症状。如情绪烦恼、容易激怒、睡眠障碍、肌肉出现紧张性疼痛等&#xff0c;生活中有很多人在自己的不到休息或者遇到强大打击时就会嘲笑自己患上神经衰弱。甚至一些会盲目采取措施&…...

Linux之进程替换

进程替换1.什么是进程替换2.替换函数2.1 execl函数2.2 execv函数2.3 execlp函数2.4 execvp函数2.5 在自己的C程序上如何运行其他语言的程序&#xff1f;2.6 execle 函数2.7 小结3.一个简易的shell1.什么是进程替换 fork()之后&#xff0c;父子各自执行父进程代码的一部分&…...

关于清除浮动

浮动最早是用来做图文排版&#xff0c;为了让块级元素同行显示&#xff0c;而html中块元素是有自己的排列规则&#xff0c;一般独占一行。所以有了浮动元素&#xff0c;一旦元素浮动了就会脱离文档流&#xff0c;产生问题。怎么去清除浮动&#xff1a;&#xff08;1&#xff09…...

Uber H3 index 地图索引思考

H3 是 uber 设计的六边形空间索引&#xff0c;go 语言操作包是 h3-go&#xff0c;可以通过经纬度获取所在的 h3 六边形边界&#xff0c;每个经纬度对应的六边形都是确定的&#xff0c;每个六边形唯一对应了一个 h3index。在业务开发中&#xff0c;我们可以通过 h3index 来对地理…...

多线程的几种状态

Java-多线程的几种状态&#x1f50e;1.NEW( 系统中线程还未创建,只是有个Thread对象)&#x1f50e;2.RUNNABLE( (就绪状态. 又可以分成正在工作中和即将开始工作)&#x1f50e;3.TERMINATED(系统中的线程已经执行完了,Thread对象还在)&#x1f50e;4.TIMED_WAITING(指定时间等待…...

【算法题】1574. 删除最短的子数组使剩余数组有序

题目&#xff1a; 给你一个整数数组 arr &#xff0c;请你删除一个子数组&#xff08;可以为空&#xff09;&#xff0c;使得 arr 中剩下的元素是 非递减 的。 一个子数组指的是原数组中连续的一个子序列。 请你返回满足题目要求的最短子数组的长度。 示例 1&#xff1a; …...

理解对数——金融问题中的自然对数(以e为底的对数)

第3章 金融问题(Financial Matters)——金融问题中的自然对数If thou lend moneyto any ofMy people. ...thou shalt not beto him as a creditor;neither shall yelay upon him interest.(如果你借钱给我的任何人。 ……你不应该是他的债权人&#xff1b;也不可向他加息。)——…...

vue2进阶学习之路

HTML、CSS和JavaScript基础 在学习Vue2之前&#xff0c;需要掌握HTML、CSS和JavaScript的基础知识。包括HTML的标签、CSS的布局和样式、JavaScript的变量类型、条件语句、循环语句等。 Vue2的基础知识 掌握Vue2的基本概念和语法&#xff0c;包括Vue2实例、数据绑定、指令、组件…...

决策树ID3算法

1. 决策树ID3算法的信息论基础 机器学习算法其实很古老&#xff0c;作为一个码农经常会不停的敲if, else if, else,其实就已经在用到决策树的思想了。只是你有没有想过&#xff0c;有这么多条件&#xff0c;用哪个条件特征先做if&#xff0c;哪个条件特征后做if比较优呢&#…...

C++模板基础(一)

函数模板&#xff08;一&#xff09; ● 使用 template 关键字引入模板&#xff1a; template void fun(T) {…} – 函数模板的声明与定义 – typename 关键字可以替换为 class &#xff0c;含义相同 – 函数模板中包含了两对参数&#xff1a;函数形参 / 实参&#xff1b;模板形…...

生产者消费者模型线程池(纯代码)

目录 生产者消费者模型 条件变量&&互斥锁&#xff08;阻塞队列&#xff09; makefile Task.hpp BlockQueue.hpp BlockQueueTest.cc 信号量&&互斥锁&#xff08;环形队列&#xff09; makefile RingQueue.hpp RingQueueTest.cc 线程池&#xff08;封…...

K8s 应用的网络可观测性: Cilium VS DeepFlow

随着分布式服务架构的流行,特别是微服务等设计理念在现代应用普及开来,应用中的服务变得越来越分散,因此服务之间的通信变得越来越依赖网络,很有必要来谈谈实现微服务可观测性中越来越重要的一环——云原生网络的可观测。K8s 是微服务设计理念能落地的最重要的承载体,本文…...

3.29面试题

文章目录内存内存管理执行过程要点面试题内存 内存管理 由JVM管理 堆&#xff1a;new出来的对象&#xff08;包括成员变量、数组元素、方法的地址&#xff09;栈&#xff1a;局部变量&#xff08;包括方法的参数&#xff09;方法区&#xff1a;.class字节码文件&#xff08;…...

操作系统漏洞发现

操作系统漏洞发现前言一、操作系统漏洞发现1.1 namp2. Goby3. Nessus二&#xff0c;进行渗透测试2.1 使用工具进行渗透1. metasploit2.2 EXP2.3 复现文章三&#xff0c;操作系统漏洞修复前言 不管是对于App来说&#xff0c;还是web站点来说&#xff0c;操作系统是必须的&#x…...

Linux gdb调试底层原理

TOC 前言 linux下gdb调试程序操作过程参考本人文章:gdb调试操作; 这里不再叙述; 本文主要内容是介绍GDB本地调试的底层调试原理&#xff0c;我们来看一下GDB是通过什么机制来控制被调试程序的执行顺序; 总结部分是断点调试的底层原理&#xff0c;可以直接跳转过去先看看大概…...

LC-1647. 字符频次唯一的最小删除次数(哈希+计数)

1647. 字符频次唯一的最小删除次数 难度中等56 如果字符串 s 中 不存在 两个不同字符 频次 相同的情况&#xff0c;就称 s 是 优质字符串 。 给你一个字符串 s&#xff0c;返回使 s 成为 优质字符串 需要删除的 最小 字符数。 字符串中字符的 频次 是该字符在字符串中的出现…...

HTTP状态码

100: 接受&#xff0c;正在继续处理 200: 请求成功&#xff0c;并返回数据 201: 请求已创建 202: 请求已接受 203: 请求成为&#xff0c;但未授权 204: 请求成功&#xff0c;没有内容 205: 请求成功&#xff0c;重置内容 206: 请求成功&#xff0c;返回部分内容 301: 永久性重定…...

【Linux】初见“which命令”,“find命令”以及linux执行命令优先级

文章目录1.which命令1.1 whereis命令1.2 locate命令1.3 搜索文件命令总结2.find命令2.1 find之exec用法2.2 管道符之xargs用法3 Linux常用命令4.命令执行优先级1.which命令 查找命令文件存放目录 搜索范围由环境变量PATH决定&#xff08;echo $PATH) which命令格式&#xff1…...

初学者求教怎样做网站/网店如何推广

这是我个人的一点小想法啊&#xff0c;不代表准确 在c语言中我经常会使用到这样的用法&#xff1a; int main() {int i0,j0;for(i0,j10;i<5&&j>3;i,j--){printf("%d %d\n",i,j);}}//然后就会得到我想要的输出结果&#xff0c;如下&#xff1a; 0 10 …...

wordpress文章在哪/企业网站营销的优缺点及案例

上下文处理器用来处理返回给全局模板的数据&#xff0c;可以通过上下文处理器统一给上下文附加数据&#xff0c;这样一来&#xff0c;就无需在每个视图函数中实现重复的逻辑。 文章目录一、内置上下文处理器二、自定义上下文处理器一、内置上下文处理器 在settings.TEMPLATES.O…...

怎么做网站内链/站长工具网址查询

现在在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML以及 Google 的 Protobuf。Protobuf是后起之秀&#xff0c;其在效率、兼容性等方面更加出色。很多人在项目技术选项中&#xff0c;尤其是网络通信、通用数据交换等场景应该会优先选择Protobuf。白鹭引擎首…...

网站建设 发票/实时排名软件

前言 deque 双端队列,支持从两头push和pop数据,比一般的队列功能更加强大。也是一个常用的数据结构。本系列博客将来分析deque的实现源码。这个deque比之前看的vector复杂了一些。 基础函数 inline size_t __deque_buf_size(size_t n, size_t sz) {return n ! 0 ? n : (sz …...

二手书交易网站策划书/什么是营销

一 关键字 1. 什么是关键字 关键字就是C语言提供的有特殊含义的符号 也叫做"保留字" C语言一共提供了32个关键字 这些关键字都被C语言赋予了特殊含义 auto double int struct break else long switch case enum register typedef char extern return union const flo…...

推广哪个app最挣钱/网站用户体验优化

Notification Interface 提供一种协议&#xff0c;使得分布于各个网站的消息发送点能够方便地向一个集合点发送消息&#xff0c;通知有新消息到达&#xff0c;请前往查看详细内容。 消息发送点&#xff1a;可以是位于blog、facebook、twitter等网站的一段程序&#xff0c;能够将…...