C++的内存模型

news2024/11/16 15:50:03

大家好:

        衷心希望各位点赞。

        您的问题请留在评论区,我会及时回答。

内存分区模型

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

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

全局区:存放全局变量、静态变量、常量。

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

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

内存4区的意义:

        不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活性去编程。

1.程序运行前

程序运行前,生成了 exe 可执行程序,为执行该程序之前,内存划分为两个区域

代码区:

        存放 CPU 执行的机器指令

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

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

全局区:

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

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

        该区域的内存空间在程序执行结束之后由操作系统释放。

总结:

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

        代码区的特点是共享和只读。

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

        常量区中存放 const 修饰的全局常量、字符串常量。

2.程序运行后

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

        注意:不要返回局部变量的地址,因为栈区开辟的内存空间由编译器自动释放。函数执行结束后,就自动出栈,函数内部的局部变量就会被销毁,分配给局部变量的内存空间也会被回收。这个时候,如果再通过指针对它的局部变量进行操作,就会发生意想不到的错误。

#include <iostream>
#include <Windows.h>

using namespace std;

// 栈区注意事项:不能返回局部变量的地址
// 栈区的数据由编译器管理分配和释放

int* func() 
{
	int a = 10; //局部变量,存放在栈区,栈区的数据在函数执行结束后就自动销毁
	return &a; // 返回局部变量的地址
}

int main(void)
{
	int* p = func(); // 接收func的返回值

	// 打印指针变量p指向的数据
	cout << *p << endl; // 打印10,第一次可以正确打印数字,是因为编译器做了保留
	cout << *p << endl; // 打印乱码,第二次打印,编译器就不再保留数据了

	system("pause");
	return 0;

}

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

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

#include <iostream>
#include <Windows.h>

using namespace std;

// 栈区注意事项:不能返回局部变量的地址
// 栈区的数据由编译器管理分配和释放

int* func() 
{
	// 利用 new 关键字,可以将数据开辟到堆区
	int* a = new int(10); // new关键字在堆区动态分配内存空间,并返回首地址
	return a; // 返回指针变量a
}

int main(void)
{
	int* p = func(); // 接收func的返回值

	// 打印指针变量p指向的数据
	cout << *p << endl; // 打印10
	cout << *p << endl; // 打印10,因为p指向的数据存放在堆区,堆区数据由程序员自主分配和销毁

	system("pause");
	return 0;

}

        总结:

        堆区数据由程序员开辟和销毁。

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

3.new操作符

        在C++中,利用 new 关键字在堆区开辟内存空间。

        堆区的内存空间,由程序员手动开辟,手动释放,利用 delete 关键字

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

new 运算符的使用方法icon-default.png?t=N7T8https://blog.csdn.net/weixin_45146479/article/details/136642423?spm=1001.2014.3001.5501delete 运算符的使用方法icon-default.png?t=N7T8https://blog.csdn.net/weixin_45146479/article/details/136643466?spm=1001.2014.3001.5501

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

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

相关文章

是时候来唠一唠synchronized关键字了,Java多线程的必问考点!

写在开头 在之前的博文中&#xff0c;我们介绍了volatile关键字&#xff0c;Java中的锁以及锁的分类&#xff0c;今天我们花5分钟时间&#xff0c;一起学习一下另一个关键字&#xff1a;synchronized。 synchronized是什么&#xff1f; 首先synchronized是Java中的一个关键字…

机器学习-06-无监督算法-01-划分聚类Kmeans算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中无监督算法&#xff0c;包括划分聚类等。 参考 数据分析实战 | K-means算法——蛋白质消费特征分析 欧洲48国英文名称的来龙去脉及其国旗动画 Kmeans在线动态演示 本门课程的目标 完成一个特定行业的…

基于modbus TCP实现EPICS与西门子S7 1200系列1215C PLC的通信

PLC介绍 西门子系列PLC在国内的市场占比第一&#xff0c;1200系列中小型PLC&#xff0c;因其众多的产品序列、强大的通讯功能和丰富扩展模块&#xff0c;被使用在工业生产、自动化生产线、智能制造、机器人等各行各业。根据CPU的供电电源的型号和数字量输出的类型&#xff0c;…

科技革新背后:码垛机器人在不同领域的实践应用

随着科技的进步&#xff0c;机器人技术已经渗透到各个行业之中&#xff0c;成为提高生产效率、减少人工成本的重要工具。码垛机器人作为自动化技术的杰出代表&#xff0c;其在各个行业中的应用场景日益广泛&#xff0c;从食品饮料到化工产品&#xff0c;再到物流仓储&#xff0…

矩阵计算-线性系统和 LU 分解

一、三角系统 …… 二、高斯消元法 …… 三、LU分解--直接三角分解法 求解线性方程Axb&#xff1a; 参考视频&#xff1a;【数值分析】矩阵LU三角分解| 速成讲解 考试宝典_哔哩哔哩_bilibili 令ALU&#xff0c;其中L是单位下三角矩阵&#xff08;对角线上元素都是1&#xff…

探秘国内IP代理购买:全面解析与实用建议

随着网络空间的不断发展和扩大&#xff0c;越来越多的用户需要在互联网上获取访问其他国家或地区网站的需求。而为了实现这一目的&#xff0c;使用IP代理服务成为了一种常见的方式。在国内&#xff0c;选择合适的IP代理服务商并购买适合自己需求的IP代理已成为许多人关心的问题…

JavaScript 权威指南第七版(GPT 重译)(二)

第四章&#xff1a;表达式和运算符 本章记录了 JavaScript 表达式以及构建许多这些表达式的运算符。表达式 是 JavaScript 的短语&#xff0c;可以 评估 以产生一个值。在程序中直接嵌入的常量是一种非常简单的表达式。变量名也是一个简单表达式&#xff0c;它评估为分配给该变…

mongodb文档数据建模

基础建模 内嵌方法和数组方完成关系表述 内嵌一对一关系建模 数组内嵌一对N 关系建模 数组内嵌对象多对多关系建模 文档模型设计之二&#xff1a;工况细化 join 查询 不支持外键 设计模式集锦 版本迭代加schema_version 字段 频繁写入改为时间区间写入 聚合变预聚合方式 采用…

银行数字人民币系统应用架构设计

2019年10月&#xff0c;01区块链联合数字资产研究院发布了《人民币3.0&#xff1a;中国央行数字货币运行框架与技术解析》&#xff0c;从数字货币界定和人民币发展历程出发&#xff0c;区分了央行数字货币与比特币、移动支付等的区别&#xff0c;全面介绍了央行数字货币的发展历…

【Linux实践室】Linux用户管理实战指南:新建与删除用户操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux创建用户命令2.1.1 知识点讲解2.1.2 案…

IDEA调优-四大基础配置-编码纵享丝滑

文章目录 1.JVM虚拟机选项配置2.多线程编译速度3.构建共享堆内存大小4.关闭不必要的插件 1.JVM虚拟机选项配置 -Xms128m -Xmx8192m -XX:ReservedCodeCacheSize1024m -XX:UseG1GC -XX:SoftRefLRUPolicyMSPerMB50 -XX:CICompilerCount2 -XX:HeapDumpOnOutOfMemoryError -XX:-Omi…

matlab和stm32的安装环境。能要求与时俱进吗,en.stm32cubeprg-win64_v2-6-0.zip下载太慢了

STM32CubeMX 6.4.0 Download STM32CubeProgrammer 2.6.0 Download 版本都更新到6.10了&#xff0c;matlab还需要6.4&#xff0c;除了st.com其他地方都没有下载的,com.cn也没有。曹 还需要那么多固件安装。matlab要求制定固件位置&#xff0c;然后从cubemx中也指定…

必示科技携手云杉网络发布“智能可观测性联合解决方案”

近日&#xff0c;必示科技与云杉网络携手发布“智能可观测性联合解决方案”&#xff0c;整体方案融合云杉网络DeepFlow产品在可观测性领域、必示科技AIOps产品在运维数据分析领域的深厚技术积淀&#xff0c;完整实现IT系统高质量、高性能、全栈的可观测数据采集、智能监控和智能…

森工新材料诚邀您参观2024杭州快递物流展会

2024杭州快递物流供应链与技术装备展览会 2024.7.8-10 杭州国际博览中心 参展企业介绍 深圳森工新材料科技有限公司。该公司致力于对传统包装材料的环保升级与替代&#xff0c;产品已广泛应用于日用消费品、工业生产、农业种植及医疗卫生领域。降解产品于2020年已入选国家邮政…

【Linux 08】进程概念

文章目录 &#x1f308; 01. 基本概念&#x1f308; 02. 描述进程 PCB&#x1f308; 03. 使用 ./ 的方式创建进程&#x1f308; 04. ps 查看进程&#x1f308; 05. getpid / getppid 获取进程标识符&#x1f308; 06. kill 终止指定进程&#x1f308; 07. fork 创建子进程&…

unity学习(67)——控制器Joystick Pack方向

1.轮盘直接复制一个拖到右边就ok了&#xff0c;轮盘上是有脚本的。&#xff08;只复制&#xff09; 2.上面的显示窗也可以复制&#xff0c;但是要绑定对应的轮盘&#xff08;unity中修改变量&#xff09;&#xff0c;显示窗上是有脚本的。&#xff08;复制改变量&#xff09; 3…

分享 | 使用Virtuoso VCPVSR工具基于标准单元的布局布线流程

​ 本节内容 导览 一、准备工作 二、运行VCP前的配置 三、VCP的布局规划 四、VCP的自动摆放 五、VSR的自动绕线 分享使用Virtuoso GXL Custom Digital Placer(VCP) & Space-based Router(VSR)工具进行基于纯数字Standard-Cell布局布线的操作流程。 VCP&VSR演…

解决mysql问题: this is incompatible with sql_mode=only_full_group_by

今天在部署一趟测试环境的服务&#xff0c;各种配置文件都配好了&#xff0c;启动服务后台报错&#xff0c;解决后记录一下&#xff0c;小伙伴们也可以看看&#xff01; ### Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause…

Mac nvm install failed python: not found

报错 $>./configure --prefix/Users/xxx/.nvm/versions/node/v12.22.12 < ./configure: line 3: exec: python: not found nvm: install v12.22.12 failed!解决方法 到 App 文件夹&#xff0c;并且打开 cd /System/Applications/Utilities/ open .记得改完 Rosetta 之…

Nginx 全局块配置 worker 进程的两个指令

1. 前言 熟悉 nginx 运行原理的都知道&#xff0c;nginx 服务启动后&#xff0c;会有一个 master 进程和多个 worker 进程&#xff0c;master 进程负责管理所有的 worker 进程&#xff0c;worker 进程负责处理和接收用户请求 在这里我们所要研究的是 master 进程一定要创建 wo…