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

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 &num;}

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)电路模型和电路定律

电路中的电压、电流之间具有两种约束&#xff0c;一种是由电路元件决定的元件约束&#xff1b;另一种是元件间连接而引入的几何约束&#xff08;就是拓扑约束&#xff09;&#xff0c;后者由基尔霍夫定律来表达。基尔霍夫定律是集总参数电路的基本定律。 1.电路和电路模型电源又…...

pytest 基础

pytest安装 安装 pip install -U pytest 验证安装 pytest --version 约束&#xff1a; 所有的测试文件名都需要满足test_ *.py格式或* _test.py格式。 测试文件中的测试类以Test_开头&#xff0c;并且不能带有 init 方法。 测试类中可以包含一个或多个test_开头的函数。 步骤…...

软测入门(七)python操作数据文件(Json、yaml、csv、excel、xml)

python操作文件 txt文件 read() : 读取所有readline() : 读取一行readlines() : 读取所有&#xff0c;且以行为单位&#xff0c;放入list列表中 file open(r"F:\abc.txt", "r", encoding"utf-8") # 以utf-8格式读取文件 # 读取所有 # print…...

【小程序】django学习笔记1

网页能用&#xff0c;不知道小程序能不能用。应该能吧。。。。。创建django程序文件包&#xff0c;xxx处是给该文件夹起个名django-admin startproject xxx一个project是由很多个app&#xff08;小应用&#xff09;组成的在文件夹目录下创建一个app&#xff0c;xxx处给该app起个…...

MySQL常用函数整理

MySQL常用函数整理sql函数分类一、流程控制1、判断值为null或空字符串2、IF函数3、IFNULL函数4、CASE函数(1) 相当于switch case的作用(2) 相当于if elseif的作用5、COALESCE函数二、字符串类&#xff08;GBT答案&#xff09;1、用于select、insert等子句中2、用于where子句中其…...

设计模式—“组件协作”

现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 典型模式有:Template Method、Observer、Strategy 一、Template Method 动机 在软件构建过程中,对于某一…...

vue里使用driver.js实现项目功能向导指引

介绍 https://github.com/kamranahmedse/driver.js driver.js 是一个轻量级、无依赖的原生JavaScript引擎&#xff0c;在整个页面中驱动用户的注意力&#xff0c;强大的、高度可定制的原生JavaScript引擎&#xff0c;无外部依赖&#xff0c;支持所有主流浏览器。 安装 npm …...

详解JAVA类加载

目录 1.概述 2.双亲委派 3.ServiceClassLoader 4.URLClassLoader 5.加载冲突 1.概述 概念&#xff1a; 类加载器&#xff08;Class Loader&#xff09;是Java虚拟机&#xff08;JVM&#xff09;的一个重要组件&#xff0c;负责加载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语言中的三…...

数据结构和算法学习记录——删除有序数组中的重复项、合并两个有序数组

去重删除有序数组中的重复项题目来自&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/题目描述给你一个 升序排列 的数组 nums &#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数…...

FPGA实现模拟视频BT656解码 TW2867四路PAL采集拼接显示 提供工程源码和技术支持

目录1、前言2、模拟视频概述3、模拟视频颜色空间4、逐行与隔行5、BT656数据与解码BT656数据格式BT656数据解码6、TW2867芯片解读与配置TW2867芯片解读TW2867芯片配置TW2867时序分析7、设计思路与框架8、vivado工程详解9、上板调试验证10、福利&#xff1a;工程代码的获取1、前言…...

【建议收藏】超详细的Canal入门,看这篇就够了!!!

概述 canal是阿里巴巴旗下的一款开源项目&#xff0c;纯Java开发。基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费&#xff0c;目前主要支持了MySQL&#xff08;也支持mariaDB&#xff09;。 背景 早期&#xff0c;阿里巴巴B2B公司因为存在杭州和美国双机房部…...

KubeSphere 社区双周报 | OpenFunction v1.0.0-rc.0 发布

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.02.17-2023.…...

查漏补缺3月

SPI扩展序列化方式 分布式ID的相关问题 TCP的流量控制&#xff0c;避免浪费网络资源的滑动平均法也可以用在其他可能会出现资源浪费的情况等 讲一讲对自己这个 RPC 项目的想法&#xff0c;你是怎么设计这个项目的&#xff0c;想要实现那些功能&#xff1f; 你认为一个好的 RPC…...

如何使用Java实现类似Windows域登录

什么是域登录&#xff1f; 域登录是一种集中式身份验证和授权方法&#xff0c;用于访问企业内部网络和资源。在Windows环境中&#xff0c;域是一组计算机和用户帐户的集合&#xff0c;受到单个安全管理的控制。域登录允许用户在访问域资源时使用单个帐户名和密码进行身份验证&…...

生成模型与判别模型

生成模型与判别模型 一、决策函数Yf(X)或者条件概率分布P(Y|X) 监督学习的任务就是从数据中学习一个模型&#xff08;也叫分类器&#xff09;&#xff0c;应用这一模型&#xff0c;对给定的输入X预测相应的输出Y。这个模型的一般形式为决策函数Yf(X)或者条件概率分布P(Y|X)。 …...

Kotlin lateinit 和 lazy 之间的区别 (翻译)

Kotlin 中的属性是使用var或val关键字声明的。Late init 和 lazy 都是用来初始化以后要用到的属性。 由于这两个关键字都用于声明稍后将要使用的属性&#xff0c;因此让我们看一下它们以及它们的区别。 Late Init 在下面的示例中&#xff0c;我们有一个变量 myClass&#xff0…...

Golang alpine Dockerfile 最小打包

最近在ubantu 上进行了 iris项目的alpine 版本打包&#xff0c;过程遇到了一些问题&#xff0c;记录一下。 golang版本 &#xff1a;1.18 系统&#xff1a;ubantu 代码结构 Dockfile内容 FROM alpine:latest MAINTAINER Si Wei<3320376695qq.com> ENV VERSION 1.1 ENV G…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...