【C++】堆区空间的申请和释放--- 2024.3.19

news2024/11/24 20:53:38

目录

      • C++和C的区别(申请堆区空间)
      • C++中的new和delete
      • 结束语

C++和C的区别(申请堆区空间)

c语言中,在遇到需要申请一块堆区空间时,我们往往会使用malloc申请,使用free进行释放,但是为什么在c++中要使用新的方法?其实是有原因的。

我们先尝试在c++中使用mallocfree函数试试,看会不会有什么问题。

代码如下:

class Maker
{
public:
	Maker()
	{
		cout << "构造函数" << endl;
	}

	Maker(int a)
	{
		cout << "有参构造函数" << endl;
	}
	~Maker()
	{
		cout << "析构函数" << endl;
	}
};

void test01()
{
	Maker* m = (Maker*)malloc(sizeof(Maker));

	free(m);
}


int main()
{
	test01();
}

接下来进行代码分析:

Maker* m = (Maker*)malloc(sizeof(Maker));

如上所示,由于声明的对象数据类型为Maker*,则在malloc之前也需要进行类型转换为Maker*,并且malloc中的参数为具体申请的空间大小,即数据类型Maker的大小,即sizeof(Maker)

free(m);

同样在使用完一块堆区空间之后,我们需要使用free函数对申请的堆区空间进行释放。

代码运行结果如下:

在这里插入图片描述

如上所示,在使用malloc申请堆区空间和使用free释放堆区空间时,并不会调用本身的构造函数和析构函数,这其实就是在c++中不使用mallocfree的原因,那到底用什么方法呢?这就是接下来要讲解的内容。

C++中的new和delete

c++中使用new的形式来申请堆区空间,使用delete的形式来释放堆区空间,具体使用案例如下:

class Maker
{
public:
	Maker()
	{
		cout << "构造函数" << endl;
	}

	Maker(int a)
	{
		cout << "有参构造函数" << endl;
	}
	~Maker()
	{
		cout << "析构函数" << endl;
	}
};

void test02()
{
	Maker* m = new Maker;
	
	delete m;
	m = NULL;

	Maker* m2 = new Maker(10);

	delete m2;
	m2 = NULL;
}

int main()
{
	test02();
}

接下来进行代码分析:

Maker* m = new Maker;

如上所示,使用new的方式来申请堆区空间,也不需要像malloc那样还需要传入申请的具体内存大小,这些部分实际上c++已经替我们处理了,所以我们只需要new + 实际的类即可。

delete m;

c++中使用delete来释放申请的堆区空间,由于之前我们已经实例化对象,并且实例化对象名为m,所以我们直接delete m即可。

m = NULL;

成功释放掉堆区空间之后,我们需要将实例化对象m置空,这也是为了保证代码的严谨和规范。

Maker* m2 = new Maker(10);

在之前的代码中,在申请堆区空间时,实际上调用的是类的构造函数,但是假如我们想要调用类的有参构造函数时,需要怎么调用呢?

如上代码所示,相较于无参构造函数,只需要在原来的基础上使用new Maker(10)的形式即可。

delete m2;

c++中使用delete来释放申请的堆区空间,由于之前我们已经实例化对象,并且实例化对象名为m2,所以我们直接delete m2即可。

m2 = NULL;

成功释放掉堆区空间之后,我们需要将实例化对象m2置空,这也是为了保证代码的严谨和规范。

代码运行结果如下:

在这里插入图片描述

如上所示,使用newdelete时,成功的调用了类的构造函数和析构函数,同时也实现了调用类的有参构造函数。

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

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

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

相关文章

深入浅出前端本地储存

引言 2021 年&#xff0c;如果你的前端应用&#xff0c;需要在浏览器上保存数据&#xff0c;有三个主流方案&#xff1a; CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

漏洞扫描服务为什么这么重要?

漏洞扫描服务作为网络安全领域的重要一环&#xff0c;发挥着不可或缺的作用。漏洞扫描服务不仅能够实时防护网络免受各类恶意攻击&#xff0c;还能为网络管理人员提供定期的安全自我检测与评估&#xff0c;确保网络的稳定与安全运行。那么什么是漏洞扫描呢&#xff1f; 漏洞是在…

蓝桥杯之动态规划冲刺

文章目录 动态规划01背包小练一下01背包网格图上的DP完全背包 最长公共字符串最长递增子序列 动态规划 动态规划&#xff1a;确定好状态方程&#xff0c;我们常常是确定前 当状态来到 i 时&#xff0c;前 i 个物体的状态是怎么样的&#xff0c;我们并不是从一个点去考虑&#x…

【1】THIS IS NOT PROLIFIC PL2303. PLEASE CPMTACT YOUR SUPPLIER

0x01 问题描述 连接COM口连接不上&#xff0c;出现THIS IS NOT PROLIFIC PL2303. PLEASE CPMTACT YOUR SUPPLIER.如下图 0x02 问题解决 1、分析后&#xff0c;因为是windows 11 系统&#xff0c;就装一下驱动。右键单击--》属性 2、更新驱动程序--》浏览我的电脑以查找驱动程序…

企业应如何建立有效的内控制度?

内部控制制度&#xff08;以下简称“内控制度”&#xff09;作为企业生产经营活动自我调节、自我约束的内在机制&#xff0c;在企业管理系统中具有举足轻重的作用。内部控制制度的建立、健全及实施情况的好坏&#xff0c;是企业生产经营成败的关键。因此&#xff0c;企业应该建…

粒子群算法 - 目标函数最优解计算

粒子群算法概念 粒子群算法 (particle swarm optimization&#xff0c;PSO) 由 Kennedy 和 Eberhart 在 1995 年提出&#xff0c;该算法模拟鸟群觅食的方法进行寻找最优解。基本思想&#xff1a;人们发现&#xff0c;鸟群觅食的方向由两个因素决定。第一个是自己当初飞过离食物…

软件工程-第三版王立福-第1章 绪论

本书结合IEEE最新发布的软件工程体系SWEBOK&#xff0c;和IEEE/ACM软件工程学科小组公布的软件工程教育知识体系SEEK&#xff0c;北大本科生指定教材。注重基础知识的系统性&#xff0c;选材的先进性及知识的应用。2009年出版 软件开发本质的认识&#xff0c;两大技术问题&…

【Linux】Linux基本开发工具(yum) (vi/vim)的使用

本文章内容&#xff1a; 学习yum工具&#xff0c;进行软件安装掌握vim编辑器使用 Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成…

一文带你详解天池工业数据集

人工智能是国家战略性新兴产业&#xff0c;制造业是国民经济的主体&#xff0c;随着人口红利的消失&#xff0c;加强设备自动化改造&#xff0c;提高生产自动化程度&#xff0c;减小劳动强度&#xff0c;改善作业环境&#xff0c;已经成为制造业的普遍共识。天池大赛开放出一批…

MySQL中的基本SQL语句

MySQL中的基本SQL语句 查看操作 1. 查看有哪些数据库 show databases; 2.切换数据库 use 数据库名;比如切换至 mysql数据库 use mysql;3.查看数据库中的表 show tables;4.查看表中数据 select 要查询的东西 from 表名 [ where 条件 ];select * from 表名…

大众EA111发动机

大众EA111发动机_什么是大众EA111发动机_太平洋汽车百科 大众EA111发动机_什么是大众EA111发动机_太平洋汽车百科 大众的EA111系列发动机是大众公司小排量发动机的主力&#xff0c;有1.2L、1.4L、1.6L三种排量。大众的EA111系列发动机融合了缸内直喷、涡轮增压等先进技术&…

数据库报Statement cancelled due to timeout错误处理方法

如上图&#xff0c;如果数据库报错&#xff0c;可考虑是事务导致锁表问题。 解决方法&#xff1a; 1.查看下在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; 2&#xff0c;kill第一步查出的线程ID

EasyExcel模板填充list时按第一行格式合并单元格(含分页线设置)

前言&#xff1a; 在使用easyExcel填充list时&#xff0c;第一行存在合并单元格的情况下&#xff0c;后面使用forceNewRow()填充的行却没有合并样式。 模板&#xff1a; 填充后&#xff1a; 自定义拦截器&#xff1a; 根据官方文档的提示&#xff0c;我们需要自定义拦截器来…

backtrader回测股票:突破20日均线买入,跌破20日均线卖出

数据源&#xff1a;akshare 回测工具&#xff1a;backtrader 策略&#xff1a;突破20日均线买入&#xff0c;跌破20日均线卖出 代码&#xff1a; from datetime import datetime import backtrader as bt #1.9.78.123 import matplotlib.pyplot as plt #3.8.3 import aks…

[Qt学习笔记]QT下获取Halcon图形窗口鼠标事件并执行相应操作

目录 1、背景2、参考信息3、目标4、步骤4.1 Halcon库的配置4.2 读取图像&#xff0c;并实现图像自适应窗体控件大小4.3 主要的图形绘制和贴图操作见如下代码&#xff0c;其中重点为全局函数的创建来实现选择Select、拖拽Drag和尺寸Resize事件响应。 5、总结 1、背景 在视觉项目…

春暖花开,一起来看看2024年品牌春分海报吧!

春分&#xff08;Vernal equinox&#xff09;已至&#xff0c;春花烂漫、燕子归来、百草回芽。 今天我们要分享的是2024年品牌发布的春分节气海报合集&#xff0c;快来随我们一起感受这昂扬、蓬勃的春意吧! &#xff08;1&#xff09;泸州老窖 &#xff08;2&#xff09;BD…

C语言——自定义类型——结构体(从零到一的跨越)

目录 前言 1.什么是结构体 2.结构体类型的声明 2.1结构体的声明 2.2结构体的创建和初始化 2.3结构成员访问操作符 2.3.1结构体成员直接访问 2.3.2结构体成员的间接访问 2.4结构体变量的重命名 2.5结构体的特殊声明 2.6结构的自引用 3.结构体内存对齐 3.1对齐规则 3…

docker harbor.v2.9.2搭建镜像无法下载问题解决

在通过部署docker harbor时&#xff0c;采用的是离线包的方式&#xff0c;当解压压缩包后&#xff0c;执行prepare脚本步骤中有一步是要获取prepare:v2.9.2版本镜像 结果执行脚本时报如下错误&#xff1a; Unable to find image goharbor/prepare:v2.9.2 locally 这时候我们就…

网络: DHCP 协议简介

文章目录 1. 前言2. DHCP 协议简介2.1 DHCP 客户端广播 DHCPDISCOVER 消息2.2 DHCP 服务器回复 DHCPOFFER 消息2.3 DHCP 客户端广播 DHCPREQUEST 消息2.4 DHCP 服务器回复 DHCPACK 消息2.5 剩余的工作 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&…

【Linux】shell命令运行原理---认识Linux基本指令

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.shell命令以及运行原理 1.1 shell命令 1.2 Linux内核权限 1.3 图示Linux shell和bash的区别 2.认识Linux基本指令 2.1 指令的…