【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )

news2024/9/27 23:32:19

文章目录

  • 一、C++ 对象的动态创建和释放
    • 1、C 语言 对象的动态创建和释放 的方式
    • 2、C++ 语言 对象的动态创建和释放 的方式
  • 二、代码示例 - 对象的动态创建和释放





一、C++ 对象的动态创建和释放



使用 C 语言中的 malloc 函数 可以为 类对象 分配内存 ;

  • 使用 free 函数可以释放上述分配的内存 ;

使用 C++ 语言中的 new 运算符 也可以为 类对象 分配内存 ;

  • 使用 delete 运算符 可以释放上述分配的内存 ;

首先 , 定义一个类 Student , 再为其定义一个有参的构造函数 , 和 析构函数 ;

class Student
{
public:
	// 带参构造函数
	Student(int age, int height)
	{
		m_age = age;
		m_height = height;
		cout << "执行 Student 的构造函数" << endl;
	}

	~Student()
	{
		cout << "执行 Student 的析构函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

之后 , 分别使用 C 语言的 动态内存管理 和 C++ 语言的 动态内存管理 , 分别创建和释放 Student 类实例对象 ;


1、C 语言 对象的动态创建和释放 的方式


C 语言中提供了 malloc / calloc 等申请 堆内存的 函数 ;

这里 使用 C 语言 的 malloc 函数的申请方式 , 为 Student 类实例对象 在 堆内存 中 , 申请内存空间 ;

使用 malloc 函数 申请 sizeof(Student) 字节大小的堆内存 , 并将返回的指针转为 Student* 类型 ;

Student* p = (Student*)malloc(sizeof(Student));

特别注意 : 上述申请内存 的方式 , 不会触发 Student 类的 构造函数 , 相应的 free 函数释放指针 , 也不会触发 Student 类的析构函数 ;


Student 类对象释放时 , 使用 free 函数将其释放即可 ;

free(p);

代码示例 :

	// C 语言中 为类对象 动态申请内存
	Student* p = (Student*)malloc(sizeof(Student));

	// 打印对象数据
	cout << "p->m_age = " << p->m_age << " , p->m_height = " << p->m_height << endl;

	// C 语言中 释放内存 与 malloc 相对应
	free(p);

执行结果 : 上面的代码 , 执行 , 并没有触发 Student 类的 构造函数与析构函数 , 打印出的 Student 对象值也是随机值 , 这是没有经过赋值的随机值 ;

p->m_age = -842150451 , p->m_height = -842150451

2、C++ 语言 对象的动态创建和释放 的方式


在 C++ 语言中 , 使用 new 和 delete 进行 对象的动态创建和释放 ;

使用 new Student(10, 150) 代码 , 可以在堆内存中申请 Student 对象的内存空间 , 并且会自动调用 Student 类的构造函数 , 对申请的内存空间进行初始化操作 ;

该代码会返回一个 Student 类型的指针变量 , 借助 该指针 , 可以通过 -> 符号访问 Student 对象的成员 ;

Student* p2 = new Student(10, 150);

堆内存 中的 Student 对象使用完毕后 , 可以使用 delete 操作符释放该内存 , 释放时会自动调用 Student 类的析构函数 ;

delete(p2);

特别注意 : 使用 new 和 delete 运算符 进行 对象的动态创建和释放 , 会自动调用对象的 构造函数 和 析构函数 ;


代码示例 :

	// C++ 语言中动态申请内存
	Student* p2 = new Student(10, 150);

	// 打印对象数据
	cout << "p2->m_age = " << p2->m_age << " , p2->m_height = " << p2->m_height << endl;

	// C++ 语言中 释放内存 与 new 相对应
	delete(p2);

执行结果 : 上述代码执行时 ,

  • new 运算符 创建 Student 类对象 , 会触发 Student 类的构造函数 ;
  • 打印对象数据时 , 直接将 创建 Student 对象时传入到构造函数中的数据打印出来 , 说明是调用的构造函数对该对象进行的初始化 ;
  • 最后通过调用 delete 运算符 释放了 Student 对象 , 会触发 Student 类的析构函数 ;
执行 Student 的构造函数
p2->m_age = 10 , p2->m_height = 150
执行 Student 的析构函数
Press any key to continue . . .




二、代码示例 - 对象的动态创建和释放



下面的代码中 , 分别使用了 C 语言的方式 和 C++ 语言的方式 , 对类对象进行动态内存分配 ;


代码示例 :

#include "iostream"
using namespace std;

class Student
{
public:
	// 带参构造函数
	Student(int age, int height)
	{
		m_age = age;
		m_height = height;
		cout << "执行 Student 的构造函数" << endl;
	}

	~Student()
	{
		cout << "执行 Student 的析构函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

int main()
{
	// 为类对象内存分配

	// C 语言中 为类对象 动态申请内存
	Student* p = (Student*)malloc(sizeof(Student));

	// 打印对象数据
	cout << "p->m_age = " << p->m_age << " , p->m_height = " << p->m_height << endl;

	// C 语言中 释放内存 与 malloc 相对应
	free(p);
	

	// C++ 语言中动态申请内存
	Student* p2 = new Student(10, 150);

	// 打印对象数据
	cout << "p2->m_age = " << p2->m_age << " , p2->m_height = " << p2->m_height << endl;

	// C++ 语言中 释放内存 与 new 相对应
	delete(p2);

	
	

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

执行结果 :
在这里插入图片描述

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

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

相关文章

Redis的介绍以及简单使用

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据存储系统&#xff0c;它以键值对的形式将数据存在内存中&#xff0c;并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持&#xff0c;可以广泛应用于缓存、消息队列、实…

二叉搜索树(BST,Binary Search Tree)

文章目录 1. 二叉搜索树1.1 二叉搜索树概念1.2 二叉搜索树的查找1.3 二叉搜索树的插入1.4 二叉搜索树的删除 2 二叉搜索树的实现3 二叉搜索树的应用3.1二叉搜索树的性能分析 1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xf…

Hive行转列[一行拆分成多行/一列拆分成多列]

场景&#xff1a; hive有张表armmttxn_tmp&#xff0c;其中有一个字段lot_number&#xff0c;该字段以逗号分隔开多个值&#xff0c;每个值又以冒号来分割料号和数量&#xff0c;如&#xff1a;A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-4…

LIN - 基础

LIN - 基础 概念CAN/LIN 物理层数据链路层帧格式 概念 原理 基于UART数据格式、主从结构 串行通讯 拓扑 LIN网络中有且只有一个主节点&#xff0c;其他都是从节点 优缺点 功能简单 实时性低 成本低 单主多从&#xff0c;不存在冲突&#xff0c;无需仲裁 主任务/从任务 主任务&…

电脑出现找不到msvcp120.dll无法继续执行代码,不用担心多种方法帮你搞定

今天&#xff0c;我想和大家分享的文章是“msvcp120.dll丢失的修复方法”。我相信&#xff0c;对于我们很多人来说&#xff0c;电脑是我们学习、娱乐的重要工具&#xff0c;而当电脑出现问题时&#xff0c;我们往往束手无策。因此&#xff0c;我希望通过今天的文章&#xff0c;…

笔记-搭建和使用docker-registry私有镜像仓库

笔记-搭建和使用docker-registry私有镜像仓库 拉取/安装registry镜像 和 对应的ui镜像 如果有网络可以直接拉取镜像 docker pull registry docker pull hyper/docker-registry-web没有网络可以使用我导出好的离线镜像tar包, 下载地址https://wwzt.lanzoul.com/i3im1194z12d …

积分值和面积、对称性

积分的基本含义要从积分符号说起&#xff0c;积分号含有加号的意思&#xff0c; ∫ a b f ( x ) d x \int ^b_af(x)dx ∫ab​f(x)dx可以理解为&#xff1a;区间[a,b]无限细分为无穷多个dx,无穷多个f(x)乘以dx的累积和。根据上面的描述&#xff0c;面积可以理解为 ∫ a b ∣ f (…

信息检索与数据挖掘 | (二)布尔检索与倒排索引

文章目录 &#x1f4da;词项-文档关联矩阵&#x1f407;相关名词&#x1f407;词项-文档关联矩阵的布尔查询处理 &#x1f4da;倒排索引&#x1f407;关于索引&#x1f407;建立索引&#x1f407;基于倒排索引的布尔查询处理&#x1f407;查询优化 &#x1f4da;字典数据结构&a…

Cpp/Qt-day040920Qt

目录 时钟 头文件&#xff1a;Widget.h: 源文件:Widget.c: 效果图&#xff1a; 思维导图 时钟 头文件&#xff1a;Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QPainter> #include <QTime>…

[BSidesCF 2019]Kookie

1.开启环境 2.一开始没仔细看&#xff0c;就看到login as admin 所以输了admin&#xff0c;123 想去爆破密码&#xff0c;但是没啥用 3&#xff0c;又回去看&#xff0c;看到cookie&#xff0c;就抓包&#xff0c;加上cookie usernameadmin

学习笔记|模数转换器|ADC原理|STC32G单片机视频开发教程(冲哥)|第十七集:ADC采集

文章目录 1.模数转换器&#xff08;ADC&#xff09;是什么&#xff1f;手册说明&#xff1a; 2.STC32G单片机ADC使用原理19.1.1 ADC控制寄存器&#xff08;ADC_CONTR)19.1.2 ADC配置寄存器&#xff08;ADCCFG)19.1.4ADC时序控制寄存器&#xff08;ADCTIM&#xff09;19.3 ADC相…

网络安全第一次作业

1、什么是防火墙 防火墙是一种网络安全系统&#xff0c;它根据预先确定的安全规则监视和控制传入和传出的网络流量。其主要目的是阻止对计算机或网络的未经授权的访问&#xff0c;同时允许合法通信通过。 防火墙可以在硬件、软件或两者的组合中实现&#xff0c;并且可以配置为根…

嵌入式:驱动开发 Day9

作业&#xff1a;通过platform总线驱动实现 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变&#xff08;按键中断&#xff09; 例如number0 按下按键number1 ,再次按下按键number0 d.在按下按键的时候需要同时…

VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

VHOST SCSI设备的模拟是由QEMU和HOST共同实现的&#xff0c;QEMU模拟VHOST SCSI设备配置空间等&#xff0c;而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。 在QEMU中VHOST SCSI设备继承关系如下&#xff1a; 其它设备以及对应class_init函数和realize具现化实现与V…

什么是亲子经济,小红书母婴品牌营销须知!

亲子经济已经成为当今社会的新兴概念&#xff0c;今天将要探讨亲子经济的定义、重要性以及&#xff0c;什么是亲子经济&#xff0c;小红书母婴品牌营销须知&#xff01; 一、亲子经济的定义与重要性 1.定义 亲子经济是指以儿童和家庭为中心的经济活动。其中包括了亲子旅游、教育…

中国股市杠杆是多少倍?炒股加9倍杠杆可行不?

中国股市杠杆通常情况下是在3&#xff5e;5倍之间&#xff0c;而在某些情况下&#xff0c;最高可能有十倍的杠杆。 杠杆炒股&#xff0c;即融资融券交易&#xff0c;是一种高风险高收益的投资方式。通过融资融券交易&#xff0c;投资者可以借入资金来扩大自己的投资规模&#…

容器管理工具 Docker生态架构及部署

目录 一、Docker生态架构 1.1 Docker Containers Are Everywhere 1.2 生态架构 1.2.1 Docker Host 1.2.2 Docker daemon 1.2.3 Registry 1.2.4 Docker client 1.2.5 Image 1.2.6 Container 1.2.7 Docker Dashboard 1.3 Docker版本 二、Docker部署 2.1 使用YUM源部署…

【Linux基础】第31讲 Linux用户和用户组权限控制命令(三)

用户组管理命令 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理。不同Linux系统对用户组的规定有所不同。如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户时同时创建。用户组的管理涉及用户组的添加、删除和修改。组…

Jmeter 分布式压测

‍你可以使用 JMeter 来模拟高并发秒杀场景下的压力测试。这里有一个例子&#xff0c;它模拟了同时有 5000 个用户&#xff0c;循环 10 次的情况‍。 请求默认配置 token 配置 秒杀接口 结果分析 但是&#xff0c;实际企业中&#xff0c;这种压测方式根本不满足实际需求。下面介…

IPv6协议基本概念

目前大多数设备节点支持IPv6和IPv4双栈,但随着IPv6逐渐应用,某些设备已经只支持纯IPv6,即IPv6 Only。 一、IPv6地址格式 1、IPv6地址表示方式 IPv6可以写成一组8个十六进制数,用冒号(:)分割。也可以写成128位2进制的0和1。 32即8x4,8表示8组16进制数,4表示每组16禁止包…