【C++】动态内存管理——new和delete

这篇文章我们讲一下C++的动态内存管理,从一个比较陌生的知识说起,我们知道,一个工程可以创建很多.c文件,我们如果定义一个全局变量,只要用extern声明一下,在每个文件都可以用。而用static修饰的全局变量只能在当前文件可用,局部的static修饰的变量只有程序走到这时才会去创建,并且只会初始化一回,比如是在一个普通函数内,就意味着如果第二次调用该函数,就不会去在初始化了。
上面所说的全局变量和static修饰的变量是存储在静态区的,我们这里所说的动态内存分配都是在堆区上的,下面说一下new和delete的基本用法,基本的形式是这样的:

int main() {int* p1 = new int;int* p2 = new int[10];return 0;
}

基本用法就是这样,用一个指针去接收,跟malloc是一样,但是后面会简单很多,如果就开辟一个空间的话,就直接加类型,要开辟比如十个空间就是加上方括号。那么new函数会不会初始化呢?跟malloc一样,是不会初始化的。当然我们也可以让new去初始化,就像这样:
在这里插入图片描述

单个数据初始化就用括号,多个数据就用大括号,向上面的p2情况,如果是未完全初始化,那么后面会用0给初始化,就跟数组初始化一样
在这里插入图片描述
那么想要delete也简单,直接用就行,就像这样:
在这里插入图片描述
new时用方括号了delete时就用方括号,new时不用delete时就不用
那么下面大家想一想为什么我们C++不用之前的malloc了,而是新创建了new这个操作符,对!new是一个操作符,它跟函数调用是不一样的。不只是为了简单写,还有一些其他的用处
比如说,我们有一个自定义类型,我们用malloc去创建了一个指向该类型的对象的指针,我们是很难通过这个指针去解决初始化问题的,为什么呢?首先自定义类型的成员变量是私有的,我们不能去访问,另外构造函数是程序自动调用的,我们也无法去去调用对象的构造函数,所以我说它是很难去初始化的,但也是有办法
在这里插入图片描述
但这种办法确实很鸡肋,我们这只是为了证明它可以改变。
malloc会存在这种问题,所以我们才有了new这个函数,它不仅会去开辟空间还会去调用自定义类型的构造函数
在这里插入图片描述
在这里插入图片描述
就可以这么去调用,上面是自定义类型有一个成员变量的样子,下面是有两个成员变量的样子,这就是我们上个博客写的内置类型转换。既然我们可以这么写了,那创建链表节点的时候就不用再去写相应的函数了,就可以这么去写:

struct ListNode
{ListNode(int val) {_val = val;_next = NULL;}int _val;ListNode* _next;
};int main() {ListNode* n1 = new ListNode(1);ListNode* n2 = new ListNode(2);ListNode* n3 = new ListNode(3);return 0;
}

它直接就去自动调用构造函数了,既然new自动调用构造,那么delete就会去自动调用析构函数并且去释放空间,我们平常去析构一个比如日期类对象是没有意义的,但是当我们去建一个栈的类时调用析构就有意义了

class stack {
public:stack(int capacity=4) {_a = new int[capacity];_top = 0;_capacity = capacity;}~stack() {delete(_a);_top = 0;_capacity = 0;}
private:int* _a;int _top;int _capacity;
};int main() {stack* p = new stack;delete p;return 0;
}

这个程序呢?先是p指针指向一个栈,这个栈的12个字节是在堆区开辟的,然后会去调用堆的构造函数,又在堆上开辟4*4个字节,之后delete p时,会先去调用栈的析构函数,释放4*4个字节的空间,再去释放p指向的空间,在这里delete的作用就很明显了。
除此之外,malloc如果失败的话会去返回一个空指针,而new报错的话会抛异常,更符合C++面向对象的特性
其实我们已经知道了new的作用就是开空间和调用构造函数,那么开空间其实就用我们的malloc就可以了,只不过我们要对malloc包装一下,为了处理抛异常问题,包装完之后就变成了operator new函数,这是一个全局函数,这里的operator跟我们的运算符重载是没有关系的,只是叫这个名字而已,通过汇编我们也可以看到,new会去调用两个函数
在这里插入图片描述
我们这两个call指令就是去调用函数的意思,就是跳到对应函数的地址去执行函数,以此类推,也有一个operator delete函数,它也是去封装了free,跟new是一样的。
我们知道构造函数是不能自动调用的,但是析构函数可以,但是我们也有办法显示调用构造函数,那就是使用定位new,基本使用是这样的
在这里插入图片描述
就像第二行这样,就是这么个形式,那么显示调用有什么用处呢?比如说,我们可能有时候会频繁的小规模的开辟空间,而开辟空间这个过程是比较效率低的,这是我们就可以先申请一大块空间,叫做内存池,这就留着用,这时去内存池要空间就不用开辟但是得初始化,这时我们的显式调用构造函数就派上用场了。

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

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

相关文章

MyBatis动态sql语句

1、if if元素可以用于根据条件判断是否包含某个SQL语句片段。 <!--查询年龄大于18岁且小于等于30岁的用户信息:<if>元素用于判断minAge和maxAge是否为null&#xff0c;如果不为null&#xff0c;则将对应的SQL语句片段拼接到最终的SQL语句中 --> <select id&quo…

【ecology】通过F12抓取页面SQL

1、点击流程监控&#xff0c;打开浏览器的”开发者工具“&#xff08;F12&#xff09;&#xff1b; 2、点击搜索&#xff0c;在开发者工具中找到sessionkey&#xff0c;复制后面的值。 3、http://58.213.83.186:8081/api/ec/dev/table/getxml?dataKey 上面的网址的IP地址修改…

Gee教程6.模板(HTML Template)

这一章节的内容是介绍 Web 框架如何支持服务端渲染的场景 实现静态资源服务(Static Resource)。支持HTML模板渲染。 这一章节很多内容是基于net/http库的&#xff0c;该库已经实现了很多静态文件和HMML模板的相关功能的了。 静态文件 网页的三剑客&#xff0c;JavaScript、C…

代理模式-C++实现

代理模式是一种结构型设计模式&#xff0c;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者无法引用另一个对象&#xff0c;这个时候就需要一个代理对象充当客户端和目标对象之间的中介。 代理模式就是代理对象具备目标对象的所有…

如何写项目部署文档

编写项目部署文档&#xff0c;这是确保项目顺利部署和上线的重要步骤。 1. 项目概述 在这里简要介绍项目的目的、功能和特点。 2. 系统要求 列出项目部署所需的硬件和软件要求&#xff0c;例如操作系统、Java版本、数据库等。 3. 安装步骤 描述项目的下载和安装步骤&…

看懂lscpu的输出

文章目录 1. lscpu1.1 Architecture1.2 逻辑核心数1.3 缓存1.4 CPU型号1.5 NUMA架构1.5.1 CPU多核架构1.5.2 多CPU Socket架构 2. cat /proc/cpuinfo2.1 关键字段 1. lscpu 通过lscpu查看当前系统的CPU信息。 [hadoopserver3 ~]$ lscpuArchitecture: x86_64 …

第十四周课堂笔记

7.Java语言类的关键技术 7.1类的成员的权限修饰符 private&#xff1a;表示仅能在类的内部访问该成员&#xff0c;无法从类的外部访问该成员 public&#xff1a;表示该成员可以被其他的任何类使用 缺省&#xff1a;表示该成员仅能被同一个包中的类所访问或者调用 7.2方法的…

「词令」2023年12月6日蚂蚁庄园今日问题答案是什么?支付宝蚂蚁庄园今日答案12.6

问题&#xff1a;千页豆腐的主要原料是豆腐吗&#xff1f; 选项&#xff1a;A、不是哦 B、当然是 答案&#xff1a;不是哦 解析&#xff1a;千页豆腐是素食新产品&#xff0c;以大豆分离蛋白和水为主要原料&#xff0c;食用植物油、淀粉等为辅料;添加或不添加稳定剂和凝固剂…

java--接口的其他细节

1.jdk8开始&#xff0c;接口新增了三种形式的方法 ①默认方法(实例方法)&#xff1a;使用用default修饰&#xff0c;默认会被加上public修饰。注意&#xff1a;只能使用接口的实现类对象调用 ②私有方法&#xff1a;必须用private修饰(jdk9开始才支持) ③类方法(静态方法)&a…

如何实现微信公众号自助查券返利机器人?

如何实现微信公众号自助查券返利机器人&#xff1f; 在当今的电商时代&#xff0c;越来越多的人选择在网上购物。然而&#xff0c;寻找商品的优惠券和返利却是一件繁琐的事情。为了解决这个问题&#xff0c;我们可以借助微信公众号和微赚淘客系统来实现自助查券返利机器人的功…

【聚类】K-modes和K-prototypes——适合离散数据的聚类方法

应用场景&#xff1a; 假设一批数据&#xff0c;每一个样本中&#xff0c;有唯一标识&#xff08;id&#xff09;、品类&#xff08;cate_id&#xff09;、受众&#xff08;users, 小孩、老人、中年等&#xff09;等属性&#xff0c;希望从其中找出一些样本&#xff0c;使得这…

9-MapReduce开发技术

单选题 题目1&#xff1a;MapReduce自定义排序规则需要重写下列那项方法 选项: A readFields() B compareTo() C map() D reduce() 答案&#xff1a;B ------------------------------ 题目2&#xff1a;下面关于MapReduce模型中Map函数与Reduce函数的描述正确的是 选项: A…

Docker安装与基础操作

Docker优势&#xff1a; 1.交付物标准化&#xff1a;标准化设计大大提高了物流体系的运行效率。传统的软件交付物包括&#xff1a;应 用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准 化组件。…

234 回文链表

解题思路&#xff1a; \qquad 由于链表的结构特点&#xff0c;访问链表中的元素的时间复杂度为O(n)。相比较而言&#xff0c;使用数组会方便很多&#xff0c;实现O(1)访问。 \qquad 所以这个题&#xff0c;可以先遍历一遍把数值存到数组中&#xff0c;再使用双指针判断是否是…

openlayers地图使用---跟随地图比例尺动态标绘大小的一种方式

openlayers地图使用—跟随地图比例尺动态标绘大小的一种方式 预期&#xff1a;随着地图比例尺放大缩小&#xff0c;地图上的标绘随着变化尺寸 结果图 页面元素 <script src"https://cdn.bootcdn.net/ajax/libs/openlayers/8.1.0/dist/ol.min.js"></script…

7_企业架构MySQL读写分离

企业架构MySQL读写分离 学习目标和内容 1、能够理解读写分离的目的 2、能够描述读写分离的常见实现方式 3、能够通过项目框架配置文件实现读写分离 4、能够通过中间件实现读写分离 一、背景描述及其方案设计 1、业务背景描述 时间&#xff1a;2014.6.-2015.9 发布产品类型&…

AntDesignBlazor示例——创建项目

本示例是AntDesign Blazor的入门示例&#xff0c;在学习的同时分享出来&#xff0c;以供新手参考。 示例代码仓库&#xff1a;https://gitee.com/known/AntDesignDemo 1. 开发环境 VS2022 17.8.2.NET8AntDesign 0.16.2 2. 学习目标 创建新项目安装AntDesign组件包及使用方…

帆软部分公式及sql生成(月份、季度取数)

以下均为帆软公式&#xff1a; 1.获得当前月往后推三月&#xff0c;如当前为8月&#xff0c;获得“9-11月”字样if($DATA_MONTH_BOX<10,($DATA_MONTH_BOX1)-($DATA_MONTH_BOX3)月, if($DATA_MONTH_BOX10,$DATA_YEAR_BOX年11月-$NEXT_YEAR年1月, if($DATA_MONTH_BO…

不知道如何制作电商产品说明书?推荐一个很好的方法!

作为一名电商从业者&#xff0c;你可能会经常面临一个问题&#xff1a;如何制作一份详细且吸引人的产品说明书&#xff1f;这的确是一个棘手的问题&#xff0c;因为产品说明书不仅要准确地描述产品的特点和功能&#xff0c;还要能够吸引潜在客户的注意。 一、电商网站制作产品说…

基于轻量级模型GHoshNet开发构建眼球眼疾识别分析系统,构建全方位多层次参数对比分析实验

工作中经常会使用到轻量级的网络模型来进行开发&#xff0c;所以平时也会常常留意使用和记录&#xff0c;在前面的博文中有过很多相关的实践工作&#xff0c;感兴趣的话可以自行移步阅读即可。 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobil…