C++ 01 内存模型

news/2024/5/17 18:47:02/文章来源:https://blog.csdn.net/peng_258/article/details/126898124

 内存分区的示意图。一般内存主要分为:代码区、常量区、静态区(全局区)、堆区、栈区这几个区域。

这里写图片描述

  1. 什么是代码区、常量区、静态区(全局区)、堆区、栈区?

代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的;由操作系统进行管理
常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等); 常量区内容在运行过程中不可改变
静态区(全局区、变量区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放;
 

堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏;

① 申请动态区域的时候,使用完记得释放它,如果不释放 ,这块内存就不可用了,会导致内存泄露;

② 释放的时候只能释放一次,不要重复释放,因为释放后的内存可能会去做别的事情,重复释放会出现问题,释放完后让这个指针最好指向空地址,避免下次用这个指针的时候出现地址错误。

栈区:存放函数内的局部变量,形参和函数返回值。由编译器自动分配释放,不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。

① 局部变量不要定义的太大,不然占用非常大的栈区空间,会导致栈溢出;

② 栈用于函数嵌套调用、中断切换时保存和恢复现场数据。调用函数不要有深层次的调用,调用函数的过程中栈区会不停的存储函数的一些相关的变量、地址之类的,如果有深层次函数递归的需要,尽量采用别的方式去替代它;

③ 栈:后进先出,只能在一端(称为栈顶(top))对数据项进行插入和删除。位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。所以和我们函数调用的过程是类似的,最先调用的函数总是最后返回,而最后调用的函数则是最最先返回,也就后调用先返回。栈的出栈方式决定函数的返回过程,栈的增长空间支持函数嵌套的复杂程度。

宏定义不占内存空间,在预处理阶段被展开替换掉,可执行文件中不存在宏定义,所以它不占用内存空间。

全局、静态局部变量存在在静态区(变量区、全局区)

局部变量存在于:栈区

申请动态存储区:堆区

常量存在于:常量区

调用的函数存在:代码区

new操作符:

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

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

语法: new 数据类型
 

(1)利用new创建的数据,会返回该数据对应的类型的指针
开辟堆区:

int *p=new int(10); 

释放堆区:

delete p;

(2)在堆区利用new创建的数组

开辟堆区: 

int* p = new int[10]; //10数组大小 ,这里返回的也是数组的首地址
for (int i = 0; i < 10; i++){p[i] = i; //可以用首地址加【】的方式索引}for (int i = 0; i < 10; i++){cout << p[i] << endl;}

释放堆区

delete[] p; //释放数组

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot 整合dubbo3开发rest应用

一、前言 作为微服务治理生态体系内的重要框架 dubbo&#xff0c;从出身到现在历经了十多年的市场检验而依旧火热&#xff0c;除了其自身优秀的设计&#xff0c;高性能的RPC性能&#xff0c;以及依托于springcloud-alibaba的这个背后强劲的开源团队支撑&#xff0c;在众多的微…

MongoDB6安装配置详解

官网下载地址&#xff1a; https://www.mongodb.com/try/download/community?tckdocs_server 打开后是这样的&#xff1a; 鼠标滑到上图红色箭头位置&#xff0c;可以看到最新版本目前是6.0.1&#xff0c;点击download下载即可&#xff0c;这里下载的是Windows版本。 下载好后…

vue插槽---作用域插槽(三)

编译作用域:模板中的变量,在模板对应的实例中查找相应的变量和数据。通俗的说就是父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。 作用域插槽:带参数的插槽,子组件提供给父组件参数,父组件决定其展示形式替换插槽标签。 为什…

哈希原理及模拟实现并封装unordered系列关联式容器

目录一、哈希1. 哈希概念2. 哈希冲突3. 哈希函数4. 哈希冲突的解决闭散列线性探测二次探测开散列开散列与闭散列比较二、哈希表哈希表的实现三、封装unordered系列关联式容器1. 封装unordered_set2. 封装unordered_map四、哈希表的应用1. 位图概念2. 应用3. 位图的实现2. 布隆过…

springboot客户关系管理系统源码 CRM小程序源码

CRM客户关系管理系统源码 crm小程序源码 基于springbootvue MySQL数据库开发的客户关系管理系统。 客户全流程高效管理&#xff0c;客户资料管理&#xff0c;客户跟踪管理&#xff0c;订单、合同管理&#xff0c;回款及交付管理等功能。 功能介绍 1、系统管理&#xff1a;员工…

基于STM32单片机和AD9850的智能DDS函数信号发生器

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 文章目录1、整体设计2、硬件方案3、软件程序4、实物验证1、整体设计 有一天&#xff0c;我在浏览CSDN时看到一篇关于 AD9850 的帖子。AD9850是一款可以产生1hz到40mhz左右正弦波的芯片。淘宝的产品经销商能够将芯片与提供 T…

第二章-使用KNN和GBDT进行收入的预测分析

本文是《从零开始学python数据分析与挖掘》的第二章学习心得&#xff0c;相关数据可以从对应的官方数据库获取。 提供给你的只有一份收入相关的xlsx&#xff0c;你需要通过里面的数据进行年收入的预测。 1.数据预处理 首先读取数据&#xff0c;查看是否存在缺失值。对于存在…

关于模糊理论及简单应用

关于模糊理论及简单应用 1.开始 最近导师让我了解一下模糊理论,思考能不能结合现有技术实现创新点.这篇博客主要记录一下这两天对模糊理论的学习,以及做的一个小demo,希望如果有研究相关方面的大佬能留言相互交流学习. 之前用模糊c均值聚类的时候了解过scikit-fuzzy,这次发现…

(14.1)Zotero常用功能:导入题录、参考文献

(14.1)Zotero常用功能&#xff1a;导入题录、参考文献 文章目录一、插件1.1、Zotfile1.2、Zotfile配置2、translators_CN3、zotero-pdf-translate4、jasminum5、zotero-better-bibtex-Sponsor&#xff08;待更新&#xff09;二、导入题录(知网为例)三、参考文献样式1、样式选择…

隐写术——PNG文件隐藏payload

0x01 PNG文件格式 PNG文件基本上由两部分组成: 文件头、文件数据块 文件头也叫署名域 用来标识这是一个PNG格式的文件&#xff0c;8字节长度&#xff0c;固定数据:89 50 4E 47 0D 0A 1A 0A 数据块: PNG定义了两种类型的数据块: 1:关键数据块(Critical Chunk):PNG文件必须包含&…

网课题库接口API—小白专用版本

网课题库接口API—小白专用版本 本平台优点&#xff1a;免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a;题库后台http://daili.jueguangzh…

URP渲染管线场景优化实战 2.3静态资源导入及优化——Texture

2.3 Texture导入设置及优化 2.3.1 纹理类型 DefaultNormal MapEditor GUI and Legacy GUI&#xff1a;在编辑器GUI上使用纹理的类型Sprite&#xff1a;常用于2D游戏和UGUICursor&#xff1a;鼠标光标自定义纹理类型Cookie&#xff1a;用于光照CookieLightmap&#xff1a;光照…

SQL Server 备份与恢复

use master go --还原数库库-- D:\backup1\backup restore database ERP from diskD:\backup1\backup1\stu.bak with replace,norecovery restore database ERP from diskD:\backup1\backup\stu_diff2.bak with replace ,norecovery restore log ERP from diskD:\backup1\bac…

Part17:Pandas的数据转换函数--map、apply、applymap

Pandas的数据转换函数map.apply、applymap 数据转换函数对比: map、apply、applymap 1.map用于Series值的转换 实例:将股票代码英文转换成中文名字 Series.map(dict) or Series.map(function)均可 import pandas as pd stockspd.read_excel(./datas/stocks/互联网公司股票…

Ubuntu 无法安装 vim,使用 vi 不提示输入模式

Ubuntu 默认只安装了 vim-tiny,是一个精简版,没有代码提示、代码补全。没有安装 vim-basic 时(vim-tiny 的完整版),vim-tiny 和 vi 都不提示你当前是否处于输入模式。使用 vim-tiny 的指令不是vim,而是vim.tiny;vim-basic 的指令才是vim。 在 BASH Shell 中输入 vim 就提…

JQuery对Dom的支持

JQuery操作CSS样式 添加class属性 addClass( )方法为元素添加 class 属性值 $("#div").addClass("div") $("#div") - 选择id为div的标签&#xff0c;为这个标签添加class属性&#xff0c;class的属性值为div 删除css属性 removeClass()&…

ElasticSearch搭建集群详解

Elasticsearch如果做集群的话Master节点至少三台服务器或者三个Master实例加入相同集群&#xff0c;三个Master节点最多只能故障一台Master节点&#xff0c;如果故障两个Master节点&#xff0c;Elasticsearch将无法组成集群.会报错&#xff0c;Kibana也无法启动&#xff0c;因为…

第二章 初识Linux Shell

2.1 Bash Shell 2.1.1 Bash简介 Bash是一个与Bourne Shell兼容的&#xff0c;执行从标准输入设备或文件读取的命令的命令语言解释器。Bash是Bourne-Again Shell的缩写。 Bash与原来的Unix sh shell向后兼容&#xff0c;并且融合了一些有用的Korn Shell和C Shell的特性。它相对…

Springboot毕设项目体育器材及场地管理系统60g3njava+VUE+Mybatis+Maven+Mysql+sprnig)

Springboot毕设项目体育器材及场地管理系统60g3njavaVUEMybatisMavenMysqlsprnig&#xff09;Springboot毕设项目体育器材及场地管理系统60g3njavaVUEMybatisMavenMysqlsprnig&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Web…

JavaWeb学习(4)注解案例:简单的测试框架

注解案例&#xff1a;简单的测试框架一、步骤&#xff08;1&#xff09;定义一个注解 Check&#xff08;2&#xff09;定义一个计算机类 Calculator&#xff08;3&#xff09;创建TestCheck类二、具体实现一、步骤 &#xff08;1&#xff09;定义一个注解 Check Retention(Re…