C++核心编程<内存分区模型>(1)
C++核心编程<内存分区模型>
- 1.内存分区模型
- 1.1内存分区模型概述
- 1.2内存分区的意义
- 1.3程序允许前
- 1.3.1代码区
- 1.3.2全局区
- 1.3.2.1全局区的演示
- 1.4程序运行后
- 1.4.1栈区
- 1.4.1.1栈区演示
- 1.4.2堆区
- 1.4.2.1堆区演示
- 1.5new操作符
- 1.5.1new操作的概述
1.内存分区模型
1.1内存分区模型概述
- C++程序在执行时,将内存大方向分为4个区域
- 代码区: 存放函数体的二进制代码,由操作系统进行管理的
- 全局区: 存放全局变量和静态变量以及常量
- 栈区: 由编译器自动分配释放,存放函数的参数值、局部变量等
- 堆区: 由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
1.2内存分区的意义
- 不同区域存放的数据,赋予不同的生命周期
1.3程序允许前
- 在程序编译后,生成看exe可执行文件,未执行该程序前分为两个区域
1.3.1代码区
- 存放CPU执行的机器指令
- 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
- 代码区是只读的,使其只读的原因使防止程序意外地修改了它的指令
1.3.2全局区
- 全局变量和静态变量存放在此
- 全局区还包含了常量区,字符串常量和**其他常量(const修饰的全局变量)**也存放在此
- 该区域的数据在程序结束后由操作系统释放
1.3.2.1全局区的演示
#include<iostream>
using namespace std;//全局变量
int gNum = 123;const int cgNum = 123;int main()
{// 静态变量static int sNum = 123;//常量//字符串常量// 就是一个普通的字符串// const修饰的变量//const 修饰的局部变量const string cstr = "富甲一方钱七";//创建普通局部变量int num = 123;cout << "num的局部变量内存地址为: " << &num << endl;cout << "gNum全局变量的内存地址为: " << &gNum << endl;cout << "sNum静态变量的内存地址为: " << &sNum << endl;cout << "字符串常量的地址为: " << &"法外狂徒张三" << endl;cout << "const修饰的全局变量的地址为: " << &cgNum << endl;cout << "const修饰的局部变量地址为: " << &cstr << endl; //内存地址与num局部变量地址很近system("pause");return 0;
}
1.4程序运行后
1.4.1栈区
- 由编译器自动分配释放,存放函数的参数值、局部变量等
- 注意事项: 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
1.4.1.1栈区演示
#include<iostream>
using namespace std;// 栈区数据注意事项 --- 不要返回局部变量的地址
// 栈区的数据由编译器管理开辟和释放int* func();int main()
{int* p = func();cout << *p << endl; // 23 第一次可以打印正确的数字,是因为编译器做了一次保留cout << *p << endl; // 2073663880system("pause");return 0;
}int* func()
{int num = 23; // 局部变量 存放在栈区,栈区的数据在函数执行完后自动释放return #}
1.4.2堆区
- 由程序员分配释放,若程序员不释放,程序结束时,由操作系统回收
- 在c++中主要利用new在堆区开辟内存
1.4.2.1堆区演示
#include<iostream>
using namespace std;int* func();int main()
{int* p = func();cout << *p << endl; // 123cout << *p << endl; // 123system("pause");return 0;
}int* func()
{// 利用new关键字 可以将数据开辟到堆区// 指针 本质也是局部变量,放在栈上,指针保存的数据放在堆区// new int(123) 开辟的空间,返回的是指针int* p = new int(123);return p;
}
1.5new操作符
1.5.1new操作的概述
- C++利用new操作符在堆区开辟数据
- 堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete
#include<iostream> using namespace std;int* func();int main() {int* p = func();cout << *p << endl; // 123cout << *p << endl; // 123system("pause");return 0; }int* func() {// 利用new关键字 可以将数据开辟到堆区// 指针 本质也是局部变量,放在栈上,指针保存的数据放在堆区int* p = new int(123);return p; } - 语法
new 数据类型 - 利用new创建的数据,会返回该数据对应的类型的指针
#include<iostream> using namespace std; int* func(); void test_1(); void teste_2();int main() {test_1();system("pause");return 0; }// 在堆区利用new开辟数据空间 int* func() {// 利用new关键字开启的数据类型,返回都是指针int* p = new int(123);return p; } void test_1() {int* p = func();cout << *p << endl; // 123//堆区的数据 由程序员管理开辟,程序员管理释放//如果想释放堆区的数据,利用关键词deletedelete p;// cout << *p << endl; // 引发了异常: 读取访问权限冲突。 } // 在堆区利用new开辟数组 void test_2() {// 创建10整型数据的数组,在堆区// 返回连续空间的指针的首地址int* arr = new int[10];// 释放堆区的数组// 释放数据需要加[] 释放delete[] arr; }
相关文章:
C++核心编程<内存分区模型>(1)
C核心编程<内存分区模型>1.内存分区模型1.1内存分区模型概述1.2内存分区的意义1.3程序允许前1.3.1代码区1.3.2全局区1.3.2.1全局区的演示1.4程序运行后1.4.1栈区1.4.1.1栈区演示1.4.2堆区1.4.2.1堆区演示1.5new操作符1.5.1new操作的概述1.内存分区模型 1.1内存分区模型概…...
电路基础(1)电路模型和电路定律
电路中的电压、电流之间具有两种约束,一种是由电路元件决定的元件约束;另一种是元件间连接而引入的几何约束(就是拓扑约束),后者由基尔霍夫定律来表达。基尔霍夫定律是集总参数电路的基本定律。 1.电路和电路模型电源又…...
pytest 基础
pytest安装 安装 pip install -U pytest 验证安装 pytest --version 约束: 所有的测试文件名都需要满足test_ *.py格式或* _test.py格式。 测试文件中的测试类以Test_开头,并且不能带有 init 方法。 测试类中可以包含一个或多个test_开头的函数。 步骤…...
软测入门(七)python操作数据文件(Json、yaml、csv、excel、xml)
python操作文件 txt文件 read() : 读取所有readline() : 读取一行readlines() : 读取所有,且以行为单位,放入list列表中 file open(r"F:\abc.txt", "r", encoding"utf-8") # 以utf-8格式读取文件 # 读取所有 # print…...
【小程序】django学习笔记1
网页能用,不知道小程序能不能用。应该能吧。。。。。创建django程序文件包,xxx处是给该文件夹起个名django-admin startproject xxx一个project是由很多个app(小应用)组成的在文件夹目录下创建一个app,xxx处给该app起个…...
MySQL常用函数整理
MySQL常用函数整理sql函数分类一、流程控制1、判断值为null或空字符串2、IF函数3、IFNULL函数4、CASE函数(1) 相当于switch case的作用(2) 相当于if elseif的作用5、COALESCE函数二、字符串类(GBT答案)1、用于select、insert等子句中2、用于where子句中其…...
设计模式—“组件协作”
现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 典型模式有:Template Method、Observer、Strategy 一、Template Method 动机 在软件构建过程中,对于某一…...
vue里使用driver.js实现项目功能向导指引
介绍 https://github.com/kamranahmedse/driver.js driver.js 是一个轻量级、无依赖的原生JavaScript引擎,在整个页面中驱动用户的注意力,强大的、高度可定制的原生JavaScript引擎,无外部依赖,支持所有主流浏览器。 安装 npm …...
详解JAVA类加载
目录 1.概述 2.双亲委派 3.ServiceClassLoader 4.URLClassLoader 5.加载冲突 1.概述 概念: 类加载器(Class Loader)是Java虚拟机(JVM)的一个重要组件,负责加载Java类到内存中并使其可以被JVM执行。类…...
高斯分布、高斯混合模型、EM算法详细介绍及其原理详解
相关文章 K近邻算法和KD树详细介绍及其原理详解朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解决策树算法和CART决策树算法详细介绍及其原理详解线性回归算法和逻辑斯谛回归算法详细介绍及其原理详解硬间隔支持向量机算法、软间隔支持向量机算法、非线性支持向量机算法详细…...
[Linux入门篇]一篇博客解决C/C++/Linux System Call文件操作接口的使用
目录 0.前言 1.C / C ->文件操作 1.1 C语言文件操作 1.1.1 C语言文件打开/关闭/写入 1.1.2 C语言文件的追加操作 1.1.3 C语言文件的读取 1.2 C语言文件操作 1.2.1 C文件打开 / 关闭 / 写入 1.2.2 C文件读取 1.2.3 文件追加 2.三个默认输入输出流 2.1 C语言中的三…...
数据结构和算法学习记录——删除有序数组中的重复项、合并两个有序数组
去重删除有序数组中的重复项题目来自:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/题目描述给你一个 升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数…...
FPGA实现模拟视频BT656解码 TW2867四路PAL采集拼接显示 提供工程源码和技术支持
目录1、前言2、模拟视频概述3、模拟视频颜色空间4、逐行与隔行5、BT656数据与解码BT656数据格式BT656数据解码6、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析7、设计思路与框架8、vivado工程详解9、上板调试验证10、福利:工程代码的获取1、前言…...
【建议收藏】超详细的Canal入门,看这篇就够了!!!
概述 canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。 背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部…...
KubeSphere 社区双周报 | OpenFunction v1.0.0-rc.0 发布
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2023.02.17-2023.…...
查漏补缺3月
SPI扩展序列化方式 分布式ID的相关问题 TCP的流量控制,避免浪费网络资源的滑动平均法也可以用在其他可能会出现资源浪费的情况等 讲一讲对自己这个 RPC 项目的想法,你是怎么设计这个项目的,想要实现那些功能? 你认为一个好的 RPC…...
如何使用Java实现类似Windows域登录
什么是域登录? 域登录是一种集中式身份验证和授权方法,用于访问企业内部网络和资源。在Windows环境中,域是一组计算机和用户帐户的集合,受到单个安全管理的控制。域登录允许用户在访问域资源时使用单个帐户名和密码进行身份验证&…...
生成模型与判别模型
生成模型与判别模型 一、决策函数Yf(X)或者条件概率分布P(Y|X) 监督学习的任务就是从数据中学习一个模型(也叫分类器),应用这一模型,对给定的输入X预测相应的输出Y。这个模型的一般形式为决策函数Yf(X)或者条件概率分布P(Y|X)。 …...
Kotlin lateinit 和 lazy 之间的区别 (翻译)
Kotlin 中的属性是使用var或val关键字声明的。Late init 和 lazy 都是用来初始化以后要用到的属性。 由于这两个关键字都用于声明稍后将要使用的属性,因此让我们看一下它们以及它们的区别。 Late Init 在下面的示例中,我们有一个变量 myClass࿰…...
Golang alpine Dockerfile 最小打包
最近在ubantu 上进行了 iris项目的alpine 版本打包,过程遇到了一些问题,记录一下。 golang版本 :1.18 系统:ubantu 代码结构 Dockfile内容 FROM alpine:latest MAINTAINER Si Wei<3320376695qq.com> ENV VERSION 1.1 ENV G…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
