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

2023-09-20 22:13:46





一、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;
}

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

更多推荐

【python数据分析基础】—pandas中loc()与iloc()的介绍与区别

文章目录前言一、loc[]函数二、iloc[]函数三、详细用法loc方法iloc方法总结共同点不同点前言我们经常在寻找数据的某行或者某列的时常用到Pandas中的两种方法iloc和loc,两种方法都接收两个参数,第一个参数是行的范围,第二个参数是列的范围。一、loc[]函数loc:接收的是行、列的名称或标签。在切片是按

【送书活动】网络安全(黑客)自学

前言「作者主页」:雪碧有白泡泡「个人网站」:雪碧的个人网站「推荐专栏」:★java一站式服务★★React从入门到精通★★前端炫酷代码分享★★从0到英雄,vue成神之路★★uniapp-从构建到提升★★从0到英雄,vue成神之路★★解决算法,一个专栏就够了★★架构咱们从0说★★数据流通的精妙之道★★后端进阶之路★文章目

以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMII

以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMIIGMAC系统框架(EMAC是百兆mac,GMAC是千兆mac)网卡网卡系统框架结构PHY(PhysicalLayer,物理层)MAC(MediaAccessControl、媒体访问控制器)以太网结构大框架MAC硬件框图MII(MediaIndep

使用cpolar配合Plex搭建私人媒体站

文章目录1.前言2.Plex网站搭建2.1Plex下载和安装2.2Plex网页测试2.3cpolar的安装和注册3.本地网页发布3.1Cpolar云端设置3.2Cpolar本地设置4.公网访问测试5.结语1.前言用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各种碎片时间(追剧下饭、地铁上刷剧等等),看

设计模式:单例模式

目录什么是单例模式为什么使用单例模式常见的单例写法1.懒汉式(LazyInitialization)2.双重检查锁定(Double-CheckedLocking)3.饿汉式(EagerInitialization)4.枚举实现单例总结什么是单例模式单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点来

Docker Compose

DockerCompose是一个用于定义和运行多容器Docker应用程序的工具。它使用一个YAML文件来配置应用程序的服务、网络和存储等方面,并使用简单的命令来管理应用程序的生命周期。使用DockerCompose,你可以将多个容器(即服务)组合在一起,形成一个完整的应用程序。每个服务都可以由一个或多个容器组成,并且可

Redis分布式锁及其常见问题解决方案

Redis是一种内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。由于其高性能和灵活的数据结构,Redis被广泛应用在各种场景中,包括实现分布式锁。分布式锁是一种在分布式系统中实现互斥访问的技术。在许多实际应用场景中,我们需要确保某些操作在同一时间只能被一个节点执行,例如更新共享资源、处理任务队列等。这时,我

【线性代数】沉浸式线性代数在线学习网站

地址:http://immersivemath.com/ila/index.html这是全球第一本带交互式图形的线性代数教材,作者是J.Ström,K.Åström,andT.Akenine-Möller。全书一共十章,各章节内容如下:接下来我将对各章节进行简单的总结,另外请注意,阅读过程中请一定不要忘记各章节提供的的

好物周刊#7:炫酷的浏览器标签页

村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。一、项目1.Qexo一个快速、强大、漂亮的在线Hexo编辑器,支持以下功能:自定义图床上传图片在线配置编辑在线页面管理开放API自动检查更新在线一键更新快速接入友情链接简单的说说短文类似不算子的统计自动填文章模板2.Twikoo一个简洁、安全

【云原生】k8s集群调度

目录一、调度约束1.1List-Watch工作机制1.2调度过程二、指定调度节点2.1修改成nodeSelector调度方式三、亲和性(1)节点亲和性(2)Pod亲和性3.1键值运算关系四、污点(Taint)和容忍(Tolerations)4.1污点(Taint)4.2容忍(Tolerations)4.3其它注意事项五

【使用Cpolar将Tomcat网页传输到公共互联网上】

文章目录1.前言2.本地Tomcat网页搭建2.1Tomcat安装2.2配置环境变量2.3环境配置2.4Tomcat运行测试2.5Cpolar安装和注册3.本地网页发布3.1.Cpolar云端设置3.2Cpolar本地设置4.公网访问测试5.结语1.前言Tomcat作为一个轻量级的服务器,不仅名字很有趣(让人想起童年)

热文推荐