C++:内存管理(new,delete)

目录

C/C++内存分布

C语言内存管理

C++内存管理:

new和delete的原理

new

delete

malloc/free和new/delete的区别


C/C++内存分布

在C/C++中,都有一块虚拟地址,内部井然有序的将代码分成了几部分,如下表:

栈:又叫堆栈,存放着非静态局部变量、函数参数、返回值等,栈是向下生长的

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

堆:用于程序运行时动态内存分配,栈是向上生长的

数据段:存储全局数据和静态数据

代码段:存储可执行代码、只读常量

C语言内存管理

C语言中内存管理的方式有四种:malloc、calloc、realloc、free

具体讲解如下:

C语言:动态内存管理(malloc,calloc,realloc,free)_malloc失败会返回null吗-CSDN博客

C++内存管理:

C语言中的内存管理方式C++中是可以使用的,但已经不适合C++使用了

C++中是通过new和delete操作符进行动态内存管理

int main()
{int* ptr = new int;return 0;
}

使用new关键字来开辟内存空间,new的后面需要跟一个类型,这就是一个int类型的空间

int main()
{int* ptr = new int(5);return 0;
}

在类型的后面加个(),就是初始化,里面的值就是要初始化的值

int main()
{int* ptr = new int[3];return 0;
}

在类型的后面加个[]和一个数字n,这个看起来像数组一样的东西就是开辟出来了n块类型的空间

所以这里是开辟了3块int类型的空间

这几块相应的delete应该这样使用

int main()
{int* ptr1 = new int;int* ptr2 = new int(5);int* ptr3 = new int[3];delete ptr1;delete ptr2;delete[] ptr3;return 0;
}

用了[]开辟的空间我们就使用delete[]来释放空间,否则就不需要

这里一定要匹配使用

在new int[n]开空间的时候,编译器会多开一点空间记录下这个数字n

在调用delete[]就会找到前面的这个n从而释放空间

如果不匹配使用也能调用正确可能是因为编译器优化了,导致恰好正确

new和delete的原理

new

在我们调用new时其实是调用了operator new函数申请空间

而operator new函数内部又调用了malloc来开辟空间

delete

调用delete是调用了operator delete函数释放对象的空间

而operator delete函数内部又调用了free来释放空间

malloc/free和new/delete的区别

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

2. malloc不会初始化,new会初始化

3. malloc申请空间失败会返回NULL,而new是抛异常

4. 申请自定义类型对象时malloc/free只会单纯的开辟空间和释放空间,而new申请空间后会调用对象的构造函数完成对象的初始化,delete也会调用相应的析构函数来释放空间,这也是为什么C++要有一套自己的内存管理方式

5. malloc要开多少空间需要手动计算,new只需要知道空间个数即可

6. malloc返回值时void*,需要强转,而new不需要

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

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

相关文章

C++实现LRU缓存(新手入门详解)

LRU的概念 LRU(Least Recently Used,最近最少使用)是一种常用的缓存淘汰策略,主要目的是在缓存空间有限的情况下,优先淘汰那些最长时间没有被访问的数据项。LRU 策略的核心思想是: 缓存空间有限&#xff1…

深入浅出C语言指针(进阶篇)

深入浅出C语言指针(基础篇) 深入浅出C语言指针(进阶篇) 目录 引言 一、指针和数组 1.数组名的理解 2.指针访问数组 3.一维数组传参的本质 二、二级指针 1.二级指针的概念 2.二级指针的内存表示 3.二级指针的解引用 三、字符指针 1.指针指向单个字符 2.指针指向字…

【目标检测】Anaconda+PyTorch配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch关键步骤安装,为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程,为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网:https://www.anaconda.com/ 另外&#…

Golang | Leetcode Golang题解之第278题第一个错误的版本

题目: 题解: func firstBadVersion(n int) int {return sort.Search(n, func(version int) bool { return isBadVersion(version) }) }

Elasticsearch基础(六):使用Kibana Lens进行数据可视化

文章目录 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 二、基础可视化 1、指标可视化 2、垂直堆积条形图 3、表格 三、高级可视化 1、多图层和索引 2、子桶 3、树状图 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 在Kibana主页,单击页面…

vxe-table——实现切换页码时排序状态的回显问题(ant-design+elementUi中table排序不同时回显的bug)——js技能提升

之前写的后台管理系统,都是用的antdelement,table组件中的【排序】问题是有一定的缺陷的。 想要实现的效果: antv——table组件一次只支持一个参数的排序 如下图: 就算是可以自行将排序字段拼接到列表接口的入参中&#xff0c…

Druid【基础 01】是什么+主要特点+设计原则+架构+数据结构(简单入门Druid)

Druid入门 1. 是什么2. 主要特点3. 三个设计原则4. Architecture 架构5. 数据结构5.1 DataSource 结构5.2 Segment 结构 Druid 非中文官网,内容不少且介绍的挺详细的,需要英文阅读能力或者翻译工具进行辅助。 1. 是什么 先看看官网怎么说: A…

请你谈谈:spring bean的生命周期 - 阶段5:BeanPostProcessor前置处理-自定义初始化逻辑-BeanPostProcess后置处理

BeanPostProcessor的postProcessBeforeInitialization方法是在bean的依赖注入(即属性填充)完成后,但在bean的初始化回调(如PostConstruct注解的方法或InitializingBean接口的afterPropertiesSet方法)之前被调用的。 具…

证书上的服务器名错误解决方法

方法 win r ,输入mmc 点击文件——>添加/删除管理单元 找到证书——> 添加 根据自己的存放选择存放位置 点击控制台根节点——> 受信任的根证书颁发机构——>导入 若还出现问题,则参考https://blog.csdn.net/mm120138687/article/details/…

立创梁山派--移植开源的SFUD万能的串行 Flash 通用驱动库

SFUD是什么 关于SFUD库的介绍,其开源链接(gitee,github)已经详细的阐述了. 这里是截取自它的一部分介绍: SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SF…

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,其安装后会默认开启ajp连接器,方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和…

【接口自动化_07课_Pytest+Excel+Allure完整框架集成_下】

目标:优化框架场景 1. 生成对应的接口关联【重点】 2. 优化URL基础路径封装【理解】 3. 利用PySQL操作数据库应用【理解】--- 怎么用python连接数据库、mysql 4. 通过数据库进行数据库断言【重点】 5. 通过数据库进行关联操作【重点】 一、接口关联&#xff1a…

MSP430M03507最小系统板的keil环境搭配,用keil编辑ti单片机

转载自嘉立创MSP430M03507开发手册 这篇文章只是因为我的keil版本与嘉立创的不一样,所以添加了我自己遇到的问题解析 先说说为什么要用keil编辑,因为ti单片机自己的ccs编译环境需要对应仿真器,那个加芯片都240了,哪有那么多钱买…

node.js中nodemon : 无法加载和使用问题,这是由于windows安全策略影起的按如下操作即可

1、用管理员权限打开vscode 2、文件终端中打开,输入 Set-ExecutionPolicy -Scope CurrentUser 3、再输入RemoteSigned 4、使用get-ExecutionPolicy查看权限,可以看到变为了RemoteSigned 重启问题解决

MySQL面试索引篇

1、什么是索引? 作为一个数据库,首要任务就是把数据存储好,并快速查询出用户需要的数据,而索引就相当于图书的目录一样,是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。 …

TypeScript 教程(九):类型声明文件与异步编程

目录 前言回顾装饰器与高级类型操控1. 类型声明文件a. 什么是类型声明文件(.d.ts)b. 编写和使用类型声明文件 2. 异步编程a. Promise 类型b. async/awaitc. 异步迭代器 3. 并行执行与错误处理a. Promise.allb. Promise.racec. 错误处理 结语 前言 在前几…

华为云.云日志服务LTS及其基本使用

云计算 云日志服务LTS及其基本使用 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550…

数学建模(7)——Logistic模型

一、马尔萨斯人口模型 import numpy as np import matplotlib.pyplot as plt# 初始人口 N0 100 # 人口增长率 r 0.02 # 时间段(年) t np.linspace(0, 200, 200)# 马尔萨斯人口模型 N N0 * np.exp(r * t)# 绘图 plt.plot(t, N, labelPopulation) plt.…

图片转pdf的软件有哪些?这几种转换工具了解下

在日常的办公学习中,图片转PDF的需求愈发普遍。不论是工作汇报、学习笔记还是生活点滴,我们都希望将重要的图片内容整理成易于查阅的PDF格式。那么,有哪些软件可以做到将图片转换成PDF格式呢?给大家介绍5种简单好用的转换方法&…

Linux第五节课(权限02)

1、Linux下的用户分类 root:超级用户普通用户:通过root新建的用户,adduser root不受权限约束;普通用户受权限约束; Linux系统中,所有用户都需要有密码,无论是root还是其他,即便是…