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

目录

      • 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时,成功的调用了类的构造函数和析构函数,同时也实现了调用类的有参构造函数。

结束语

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

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

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

相关文章

BUUCTF-Ezsql1

1.打开靶机 打开第一个链接 2.万能密码 使用万能密码&#xff1a;a or 1 # 密码为随意 第二个用kali打开 3.ssh连接靶机 ssh ctf284490d0-7600-4c65-9160-5ced02f45633.node5.buuoj.cn -p 28191 由题可知密码为123456 4.找到并修改index.php文件 找到index.php文件 #内容如…

Trait与生命周期

原文链接&#xff1a;(*∇&#xff40;*) 咦,又好了~ Rust – xiaocr_bloghttp://www.xiaocr.fun/index.php/2024/03/18/trait%E4%B8%8E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/ 目录 Trait 定义trait 默认实现 trait作为参数 Trait Bound语法 通过指定多个 trait bound …

【C++】内存管理和模板基础(new、delete、类及函数模板)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 内存分布 C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator d…

Cesium:绘制一个 3DTiles 对象的外包盒顶点

作者:CSDN @ _乐多_ 本文将介绍如何使用 Cesium 引擎根据模型的中心坐标,半轴信息,绘制一个 3DTiles 对象的外包盒顶点。 外包盒是一个定向包围盒(Oriented Bounding Box),它由一个中心点(center)和一个包含半轴(halfAxes)组成。半轴由一个3x3的矩阵表示,这个矩阵…

Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题&#xff0c;相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题&#xff0c;导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因&#xff0c;只是看到一些连锁反应带来的结果…… 影响因素…

qmldir的理解

目录结构&#xff1a; 文件内容 qmldir中&#xff1a; module QtLocaion plugin declarative_location classname QtLocationDeclarativeModule typeinfo plugins.qmltypes 其中&#xff1a; QtLocaion必须与qmldir所在的文件夹名字一样 plugin 后面的declarative_location 为…

SHELL——条件判断语句练习

目录 一、练习题目 二、解答过程 1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查次磁盘剩余空间。 安装邮件服务 配置邮件服务 编写脚本work1.sh 添加计划任务 2、判断web服务是否运行&#xff1a;…

项目中遇到的sql问题记录

有一张表&#xff0c;表结构及数据如下&#xff1a; INSERT INTO test.test_approve(approve_no, tra_date, tablename, part_dt) VALUES (approve001, 2021-02-18 00:00:00, tableA, 2024-03-18); INSERT INTO test.test_approve(approve_no, tra_date, tablename, part_dt) …

【Linux】日常使用命令(三)

文章目录 **cal 命令****date 命令****bc 命令****Linux下玩小游戏**&#xff1a; cal 命令 功能描述: cal 命令用于显示日历。 常用选项: -3&#xff1a;显示前一个月、当前月和下一个月的日历。-y&#xff1a;显示整年的日历。 常用示例: # 示例 1: 显示当前月的日历 cal# …

Easy Connect下载(Windows版)

文章目录 1. 下载连接2. 安装 1. 下载连接 百度网盘链接&#xff1a;https://pan.baidu.com/s/13r4wxz-Df3S_IMruZIDucw  提取码&#xff1a;mmcc 2. 安装 1. 下载安装包解压后&#xff0c;双击.exe文件就可以安装软件。 2. 耐心等待&#xfeff;&#xfeff;Easy Connect安装…

Android 开发环境搭建(Android Studio 安装图文详细教程)

Android Studio 下载 https://developer.android.google.cn/studio?hlzh-cn Android Studio 安装 检查电脑是否启用虚拟化 如果没有开启虚拟化&#xff0c;则需要进入电脑的 BIOS 中开启 直接 next选择安装的组件&#xff0c;Android Studio 和 Android 虚拟设备&#xff…

Gitlab-runner注册与配置

文章目录 概要操作流程获取HTTPS证书上传证书修改gitlab-runner dns配置文件gitlab-runner 注册 概要 本文主要介绍了Gitlab-runner在内网环境注册到gitlab的操作方式。内网环境如下&#xff1a; 1、gitlab-runner由docker镜像部署&#xff1b; 2、gitlab部署与内网&#xff0…

Linux的背景介绍

1.Linux的发展史 Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff09;&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08…

Android studio开发中Virtual Device模拟器的设置和屏幕错位等问题

Android SDK开发中Virtual Device模拟器的设置和使用 本文介绍android studio2023 3.1.13版本中模拟器的设置和在cordova开发中的运行方法 对于老版android studioAVD模拟器的使用&#xff0c;参见&#xff1a;Android SDK手机应用开发中第三方模拟器、真机运行方法以及AVD模拟…

安卓RecyclerView简单用法

废话不多说上代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schem…

60+款VSCode插件,构建超舒适开发环境

本文不做任何编辑器的比较&#xff0c;只是我本人日常使用 vscode 进行开发&#xff0c;并且比较喜欢折腾 vscode &#xff0c;会到处找这一些好玩的插件&#xff0c;于是越攒越多&#xff0c;今天给大家推荐一下我收藏的 60 多个 vscode 插件&#xff0c;据说插件装太多&#…

qt+ffmpeg 实现音视频播放(二)之音频播放

一、音频播放流程 1、打开音频文件 通过 avformat_open_input() 打开媒体文件并分配和初始化 AVFormatContext 结构体。 函数原型如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说…

Python统计初步

文章目录 基本统计特征区间统计PandaspandasGUI Python科学计算&#xff1a;数组&#x1f4af;数据生成&#x1f4af;数据交互&#x1f4af;微积分&#x1f4af;插值&#x1f4af;拟合&#x1f4af;FFT&#x1f4af;卷积&#x1f4af;滤波 基本统计特征 分析统计特征是数据分…

大规模采集主流电商平台商品详情页获取商品详情,SKU,价格操作流程

taobao API 接入 淘宝接口解析是指通过淘宝提供的API&#xff08;Application Programming Interface&#xff09;来实现程序与淘宝平台的数据交互和功能调用。通过淘宝接口&#xff0c;用户可以实现商品信息获取、订单管理、物流跟踪等功能。 在使用淘宝接口前&#xff0c;首…

BUUCTF-MISC-[QCTF2018]picture

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 解题过程 下载附件发现没有扩展名&#xff0c;用010Editor打开是png图片 保存为png格式打开&#xff1a; BUUCTF平台会缺失一些提示&#xff0c;点开题目链接在GitHub里有题目描述&#xff1a; 提示判断应该是lsb隐写&#xff0…