C++系列-内存模型

news2024/9/24 1:19:19

内存模型

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

内存模型四个区

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

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

代码区

  • 在程序编译完,生成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的地址是:00007FF7011EF054
	C_a的地址是:00000024145FFCB4
	字符串常量的地址是:00007FF7011EBCA8
	str的地址是: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指向的地址是:000002A94D356090
	10
	10
	p1指向的地址是: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.coloradmin.cn/o/900743.html

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

相关文章

工厂模式的三种姿态?

在软件工程中常见的设计模式——工厂模式。工厂模式是一种有力的工具&#xff0c;用于创建对象实例的方式&#xff0c;可以帮助我们更好地组织代码和降低耦合性。在本文中&#xff0c;我将为大家详细介绍工厂模式的三种姿态&#xff0c;同时通过举例和代码演示来帮助大家更好地…

Docker环境安装elasticsearch和kibana

一、安装elasticsearch 创建es-network&#xff0c;让es、kibana在同一个网段&#xff1a; docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…

【Redis】Redis中的布隆过滤器

【Redis】Redis中的布隆过滤器 前言 在实际开发中&#xff0c;会遇到很多要判断一个元素是否在某个集合中的业务场景&#xff0c;类似于垃圾邮件的识别&#xff0c;恶意IP地址的访问&#xff0c;缓存穿透等情况。类似于缓存穿透这种情况&#xff0c;有许多的解决方法&#xf…

高效的WMS系统手持盘点方案

WMS系统手持盘点就是指利用WMS系统支持的手持式电子盘点设备进行库存盘点的方式。 具体来说: - 手持盘点设备是一种小型的电子设备,具有移动条形码扫描功能,可以实时与WMS系统联通。 - WMS系统利用手持设备,可以给仓储人员下发具体的盘点任务,例如需要盘点的货位、商品等信息…

mybatis plus 配置自动设置创建时间和创建人id

1.新建 MyMetaObjectHandler package com.ruoyi.framework.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.ruoyi.common.bean.LocalUser; import com.ruoyi.coupon.domain.CouponUser; import org.apache.ibatis.reflection.MetaObjec…

软件报错msvcr90.dll丢失的解决方法,亲测可以修复

我曾经遇到过一个令人头疼的问题&#xff1a;msvcr90.dll丢失。这个问题导致了我的程序无法正常运行&#xff0c;让我感到非常苦恼。然而&#xff0c;在经过一番努力后&#xff0c;我终于成功地修复了这个问题&#xff0c;这让我感到非常欣慰和满足。 msvcr90.dll丢失的原因可能…

python高级基础

文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础 闭包 简单解释一下闭包就是可以在内部访问外部函数的变量&#xff0c;因为如果声明全局变量&#xff0c;那在后面就有可能会修改 在闭包中的…

深入探讨API接口测试:从基础到高级策略

引言&#xff1a;API测试的重要性 在当前的技术趋势中&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为连接各种系统和服务的基石。API不仅仅是大型企业的领域&#xff0c;中小型公司和初创公司也越来越依赖API来拓展他们的业务功能和跨系统通信。正因如此&#…

企业数字化转型大数据湖一体化平台项目建设方案PPT

导读&#xff1a;原文《企业数字化转型大数据湖一体化平台项目建设方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 喜欢文章&#xff0c;您可以点赞评论转发…

(搜索) 剑指 Offer 38. 字符串的排列 ——【Leetcode每日一题】

❓剑指 Offer 38. 字符串的排列 难度&#xff1a;中等 输入一个字符串&#xff0c;打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组&#xff0c;但里面 不能有重复元素。 示例: 输入&#xff1a;s “abc” 输出&#xff1a;[“abc”,“acb”,“bac”…

【学习日记】【FreeRTOS】时间片的实现

前言 本文以野火的教程和代码为基础&#xff0c;对 FreeRTOS 中时间片的概念作了解释&#xff0c;并且给出了实现方式&#xff0c;同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中&#xff0c;我们已经知道任务根据不同的优先级被放入就绪列表中不…

符号随机梯度下降算法SIGNSGD

考虑随机优化问题&#xff1a; 符号随机梯度下降(SIGNSGD)算法&#xff1a; 假设基础&#xff1a; 收敛定理&#xff1a; 联邦优化&#xff1a;

[Java优选系列第2弹]SpringMVC入门教程:从零开始搭建一个Web应用程序

想和你们分享我眼里的代码世界&#x1f5fa;️ 优选系列持续更新中&#x1f4ab; 一直在等你&#xff0c;你终于来啦&#x1f496; 绿色代表解释说明 黄色代表重点 红色代表精髓 SpringMVC是一个基于Java的Web框架&#xff0c;它使用了MVC&…

旅行越野SUV——捷途旅行者即将与大家见面!

从2020年开始,国内车市踊跃出许多性格鲜明的车型,例如坦克300、极氪001、蔚来ET5旅行版以及五菱悦野,虽然它们属于小众车型,但奈何销量都非常亮眼,这也从另一角度证明现如今的年轻消费群体很喜欢特点鲜明的汽车产品。前段时间,捷途汽车发布的捷途旅行者,一款定位旅行越野SUV的新…

JVM的前世今生之类加载过程

1. 什么是JVM VM是JavaVirtualMachine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它可以实现跨操作系统运行&#xff0c;即一…

CMake语法复习

前言 此文总结了库的制作和一些CMake常用的一些语法。 一&#xff1a;创建静态库和动态库 静态库的生成和使用 动态库的生成和使用 二&#xff1a;使用CMake来生成Makefile&#xff0c;生成可执行文件 顶层目录下的CMakeLists.txt project(HELLO) add_subdirectory(libhell…

设计模式之备忘录模式(Memento)的C++实现

1、备忘录模式的提出 在软件功能开发过程中&#xff0c;某些对象的状态在转换过程中&#xff0c;由于业务场景需要&#xff0c;要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态&#xff0c;便会暴露对象的实现细节。备忘录模式是在不…

ps打开出现dll文件丢失怎么回事?该如何修复

今天在看到一个ps的相关问题&#xff0c;可能很多同学也遇到过&#xff0c;安装好ps软件之后&#xff0c;打开会提示无法启动此程序。然后会有各种文件的丢失一般都是xxx.dll文件的格式&#xff0c;并提示尝试重新安装该程序&#xff0c;以解决此问题。不但是PS&#xff0c;还有…

226、仿真-基于51单片机楼道教室走道智能灯光光照人体感应检测控制Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&…

Hlang--用Python写个编程语言-函数与基本数据结构实现

文章目录 前言语法表述解析器修改词法解析函数节点函数节点解析List的解析实现解释器节点函数操作String和List处理总结前言 okey,经过一段时间的努力,接下来要实现的是函数。当然还有对应的基本数据结构,那么之后的话,我们的工作就开始进一步转换了。 那么在这块我们要实…