内存管理【C++】

内存分布

C++中的内存区域主要有以下5种

  1. 栈(堆栈):存放非静态局部变量/函数参数/函数返回值等等,栈是向下增长的【地址越越先被使用】。栈区内存的开辟和销毁由系统自动执行

  2. 堆:用于程序运行时动态内存分配,由程序员申请和释放内存,堆是向上增长的【地址越越先被使用】。

  3. 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。

  4. 数据段(全局区):存储全局数据静态数据

  5. 代码段(常量区):存放可执行的代码/只读常量


C++动态内存管理

动态内存申请

动态内存申请,申请的是堆区的内存

申请一个类型大小的空间

不初始化申请的空间语法:

T* p=new TT代指类型,p可以是任意合法标识符

int* p = new int;

即可申请1个int类型大小的未初始化的空间


初始化申请内置类型的空间语法:

T* p=new T(要初始化的值)T代指类型,p可以是任意合法标识符

int* p = new int(200);

即可申请1个int类型大小的初始化为200的空间


调用指定构造函数申请自定义类型的空间语法:

T* p=new T(传给自定义类型的构造函数的参数)T代指类型,p可以是任意合法标识符


申请连续多个类型大小的空间

不初始化申请的空间语法:

T* p=new T【n】T代指类型,p可以是任意合法标识符,n是要申请的连续的类型空间的个数

int* p = new int[12];

即可申请连续12个int类型大小未初始化的空间


初始化申请内置类型的空间语法:

T* p=new T【n】{初始值1,初始值2,……}T代指类型,p可以是任意合法标识符,n是要申请的连续的类型空间的个数

int* p = new int[12] {1,2,3,4,5,6};

即可申请连续12个int类型大小的前6个int空间的值为1,2,3,4,5,6,后6个int空间值为0的空间


调用指定构造函数申请自定义类型的空间语法:

T* p=new T【n】{{传给第一个自定义类型的构造函数的参数},{传给第二个}T代指类型,p可以是任意合法标识符,n是要申请的连续的类型空间的个数

在这里插入图片描述


动态内存释放

释放一个类型大小的空间

语法:
delete pp是存放了动态内存申请的空间的首地址的指针

int* p = new int;delete p;

释放连续多个类型大小的空间

语法:
delete[] pp是存放了动态内存申请的空间的首地址的指针

int* p = new int[12];delete[] p;

operator new和operator delete

这两个都是库里实现好的全局函数
operator new是C语言的malloc的封装函数,主要封装了malloc失败时不在返回NULL而是抛异常

申请空间本质上还是使用malloc

operator delete是C语言的free的封装函数

释放空间本质上还是使用free


new和delete以及new T[]和delete[]实现原理

new

  1. 先调用operator new函数申请空间
  2. 如果是自定义类型就再调用它的构造函数

delete

  1. 如果是自定义类型就调用它的析构函数
  2. 调用operator delete 释放申请的空间

new T[n]

  1. 调用operator new申请连续的n个类型大小的空间
  2. 如果是自定义类型就再调用n次它的构造函数

delete[]

  1. 如果是自定义类型调用n次它的析构函数
  2. 调用operator delete释放连续的n个类型大小的空间

new的delete与malloc和free的区别

  1. malloc和free是函数,new和delete是操作符

  2. malloc申请的空间不能初始化,new可以初始化

  3. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

  4. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

  5. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

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

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

相关文章

Element ui 快速入门(基础知识点)

element ui官网 前言: 在当今时代,我们在编写计算机程序时,不仅仅是写几个增删改查的简单功能,为了满足广大用户对页面美观的需求,为了让程序员们写一些功能更简便,提高团队协作效率,所以eleme…

Audio PsyChat:web端语音心理咨询系统

这是一个在服务器本地运行的web语音心理咨询系统,咨询系统内核使用PsyChat,我们为其制作了Web前端,并拼接了ASR和TTS组件,使局域网内用户可以通过单纯的语音进行交互。其中ASR和TTS组件使用PaddleSpeech API。 使用 使用单卡3090…

C语言王国——字符函数和字符串函数(2)

目录 5 strtok函数 5.1 函数的表达式 5.2 函数模拟 6 strstr函数 6.1 函数表达式 7 strerror函数 7.1 函数表达式 7.2 例子 7.3 perror 8 strncpy、strncat、strncmp函数 四 结论 5 strtok函数 strtok函数我的理解是他是一个分割字符串的函数 5.1 函数的表达式 cha…

国联易安:网络反不正当竞争,要防患于未然

据市场监管总局官网消息,为预防和制止网络不正当竞争,维护公平竞争的市场秩序,鼓励创新,保护经营者和消费者的合法权益,促进数字经济规范健康持续发展,市场监管总局近日发布《网络反不正当竞争暂行规定》&a…

图解Mysql索引原理

概述 是什么 索引像是一本书的目录列表,能根据目录快速的找到具体的书本内容,也就是加快了数据库的查询速度索引本质是一个数据结构索引是在存储引擎层,而不是服务器层实现的,所以,并没有统一的索引标准,…

【分享】两种方法禁止修改Word文档

对于比较重要的Word文件,不想被随意编辑修改,可以试试以下两个方法,不清楚的小伙伴,一起来看看吧! 方法1:设置“只读方式” 我们可以给Word文档设置以“只读方式”打开,这样就算编辑修改了文档…

[数据集][目标检测]焊接处缺陷检测数据集VOC+YOLO格式3400张8类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):3400 标注数量(xml文件个数):3400 标注数量(txt文件个数):3400 标注…

用AI工具设计赛博朋克壁纸

用AI工具设计赛博朋克壁纸 今天我要向大家分享的项目十分直观且具有高流量,我坚信这会对大家有所帮助。我相信大家在壁纸创作者的作品中一定看过科幻和赛博朋克的元素,这些深具特色的未来科技主题的壁纸影响了现代设计的方向。 设计师们巧妙地运用了几…

鸿蒙HarmonyOS实战—如何使用Video组件播放视频

1.视频播放 鸿蒙系统中,关于视频播放,可以使用上层视频组件Video。 参数如下 src 支持file:///data/storage路径前缀的字符串,用于读取应用沙箱路径内的资源。需要保证目录包路径下的文件有可读权限。 说明:视频支持的格式是&am…

在Three.js中实现模型点击高亮:整合EffectComposer与OutlinePass的终极指南

效果【后期实现鼠标点击选中轮廓后给出一个弹窗显示相应的模型信息】 标签指示线参考我的上一篇文章 引言 Three.js不仅让WebGL的3D图形编程变得简单易懂,还通过其强大的扩展库支持丰富的后期处理效果,为3D场景增添无限魅力。本篇文章将引导您深入了…

实习面试题(答案自敲)、

1、为什么要重写equals方法,为什么重写了equals方法后,就必须重写hashcode方法,为什么要有hashcode方法,你能介绍一下hashcode方法吗? equals方法默认是比较内存地址;为了实现内容比较,我们需要…

使用from…import语句导入模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在使用import语句导入模块时,每执行一条import语句都会创建一个新的命名空间(namespace),并且在该命名…

词法分析器的设计与实现--编译原理操作步骤,1、你的算法工作流程图; 2、你的函数流程图;3,具体代码

实验原理: 词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别时标识符、关键字(保留字&a…

CentOS7配置国内清华源并安装docker-ce以及配置docker加速

说明 由于国内访问国外的网站包括docker网站,由于种种的原因经常打不开,或无法访问,所以替换成国内的软件源和国内镜像就是非常必要的了,这里整理了我安装配置的基本的步骤。 国内的软件源有很多,这里选择清华源作为…

终于来啦!Stable Diffusion 3将在6月12日正式开源

6月3日晚,著名开源大模型平台Stability AI的联合首席执行官Christian Laforte,在AMD的产品发布会上宣布,文生图模型 Stable Diffusion 3将于6月12日在Hugging Face开源权重。 本次开源的是Stable Diffusion 3的Medium模型,有20亿…

Python中数字比较与获取较大值的深入解析

目录 一、引言 二、Python数字类型概述 三、数字比较操作符 四、获取较大值的逻辑与实现 五、高级话题:使用内置函数和库 六、性能分析与优化 七、案例分析 八、总结与展望 一、引言 在编程世界中,数字的比较和获取较大值是基础且常见的操作。P…

Python中上下文管理器解析

文章目录 基本原理上下文管理器的工作原理自定义上下文管理器enter和exitcontextlib 模块 异常处理 Python中的上下文管理器(Context Manager)是一种用于管理资源的机制,特别是在文件操作、数据库连接和锁定等场景中非常有用。上下文管理器通…

SpringBoot中MyBatisPlus的使用

MyBatis Plus 是 MyBatis 的增强工具,提供了许多强大的功能,简化了 MyBatis 的使用。下面是在 Spring Boot 中使用 MyBatis Plus 的步骤: 添加依赖:在 Maven 或 Gradle 的配置文件中添加 MyBatis Plus 的依赖。 配置数据源&#…

Linux【安全 02】OpenSSH漏洞修复(离线升级最新版本流程)网盘分享3个安装包+26个离线依赖

OpenSSH离线升级最新版本流程 1. 漏洞信息2. 环境说明3.依赖安装3.1 在线安装3.2 离线安装 4.备份卸载4.1 备份4.2 卸载旧版本 5.安装5.1 zlib5.2 ssl5.3 openssh5.3.1 安装5.3.2 配置 6.脚本整理7.文件资源 本文仅针对CentOS7.8版本,其他版本未测试,安装…

Excel单元格格式无法修改的原因与解决方法

Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法: 单元格或工作表被保护: 如果单元格或工作表被设置为只读或保护状态,您将无法更改其中的格式。解决方法:取消单元格或工作表的保护。在Excel中…