【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )
文章目录
- 一、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;
}
执行结果 :

相关文章:
【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )
文章目录 一、C 对象的动态创建和释放1、C 语言 对象的动态创建和释放 的方式2、C 语言 对象的动态创建和释放 的方式 二、代码示例 - 对象的动态创建和释放 一、C 对象的动态创建和释放 使用 C 语言中的 malloc 函数 可以为 类对象 分配内存 ; 使用 free 函数可以释放上述分配…...
AMS爆炸来袭,上线即巅峰
1.关于首发项目Antmons(AMS)空投结果 Gate.io Startup 首发项目Antmons代币AMS于Aug15th,AM 07:00开始下单,24小时内下单同等对待总共有15,950人下单,下单总价值超过1,000万美金分发系数约为0.001640495298341。根据上线规则AMS项目认购成功,…...
是面试官放水,还是公司实在是太缺人?这都没挂,华为原来这么容易进...
华为是大企业,是不是很难进去啊?” “在华为做软件测试,能得到很好的发展吗? 一进去就有9.5K,其实也没有想的那么难” 直到现在,心情都还是无比激动! 本人211非科班,之前在字节和腾…...
怒刷LeetCode的第2天(Java版)
目录 第一题 题目来源 题目内容 解决方法 方法一:滑动窗口 方法二:双指针加哈希表 第二题 题目来源 题目内容 解决方法 方法一:二分查找 方法二:归并排序 方法三:分治法 第三题 题目来源 题目内容 解…...
AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网络的异常检测(续)
目录 车载 CAN 总线网络异常检测技术 3.1 车载 CAN 总线网络异常检测技术概述 3.1.1基于统计的异...
mojo安装
docker安装mojo 官网 https://developer.modular.com/login 很奇怪登录页面不显示 类似于网站劫持 docker 安装mojo带jupyterlab的方式 https://hub.docker.com/r/lmq886/mojojupyterlab 拉取镜像 docker pull lmq886/mojojupyterlab docker pull lmq886/mojojupyterlab:1.2 启…...
【探索Linux】—— 强大的命令行工具 P.8(进程地址空间)
阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…...
vue3 - Element Plus 切换主题色及el-button hover颜色不生效的解决方法
GitHub Demo 地址 在线预览 Element Plus 自定义主题官方文档 如果您想要通过 js 控制 css 变量,可以这样做: // document.documentElement 是全局变量时 const el document.documentElement // const el document.getElementById(xxx)// 获取 css 变…...
【C++面向对象侯捷】1.C++编程简介
文章目录 视频来源:我的百度网盘...
年龄大了转嵌入式有机会吗?
年龄大了转嵌入式有机会吗? 首先,说下结论:年龄并不是限制转行嵌入式软件开发的因素,只要具备一定的编程和电子基础知识,认真学习和实践,是可以成为优秀的嵌入式软件开发工程师的。最近很多小伙伴找我&…...
Mysql高级——索引优化和查询优化(2)
5. 排序优化 5.1 排序优化 问题:在 WHERE 条件字段上加索引,但是为什么在 ORDER BY 字段上还要加索引呢? 优化建议: SQL 中,可以在 WHERE 子句和 ORDER BY 子句中使用索引,目的是在 WHERE 子句中避免全表…...
SpringMVC的拦截器和JSR303的使用
目录 一、JSR303 二、拦截器(interceptor) 一、JSR303 1.1.什么是JSR303 JSR 303,它是Java EE(现在称为Jakarta EE)规范中的一部分。JSR 303定义了一种用于验证Java对象的标准规范,也称为Bean验证。 Bean验…...
servlet中doGet方法无法读取body中的数据
servlet中doGet方法不支持读取body中的数据。...
Ubuntu MongoDB账户密码设置
1.创建用户 在MongoDB中,可以使用db.createUser()方法来创建用户。该方法接受一个包含用户名、密码和角色等信息的文档作为参数。 // 连接到MongoDB数据库 mongo// 切换到admin数据库 use admin// 创建用户 db.createUser({user: "admin",pwd: "adm…...
指针进阶(3)
9. 模拟实现排序函数 这里我们使用冒泡排序算法,模拟实现一个排序函数,可以排序任意类型的数据。 这段代码可以排序整型数据,我们需要在这段代码的基础上进行改进,使得它可以排序任意类型的数据。 #define _CRT_SECURE_NO_WARN…...
信息检索与数据挖掘 | (二)布尔检索与倒排索引
文章目录 📚词项-文档关联矩阵🐇相关名词🐇词项-文档关联矩阵的布尔查询处理 📚倒排索引🐇关于索引🐇建立索引🐇基于倒排索引的布尔查询处理🐇查询优化 📚字典数据结构&a…...
【学习笔记】EC-Final 2022 K. Magic
最近的题都只会抄题解😅 首先,操作顺序会影响答案,因此不能直接贪心。其次,因为是求贡献最大,所以可以考虑枚举最终哪些位置对答案产生了贡献,进而转化为全局贡献。 1.1 1.1 1.1 如果 [ l 1 , r 1 ) ⊆ [ …...
MySQL数据库笔记
文章目录 一、初识MySQL1.1、什么是数据库1.2、数据库分类1.3、MySQL简介 二、操作数据库2.1、操作数据库(了解)2.2、数据库的列类型2.3、数据库的字段属性(重点)2.4、创建数据库表(重点)2.5、数据表的类型…...
大数据之Hive(三)
分区表 概念和常用操作 将一个大表的数据按照业务需要分散存储到多个目录,每个目录称为该表的一个分区。一般来说是按照日期来作为分区的标准。在查询时可以通过where子句来选择查询所需要的分区,这样查询效率会提高很多。 ①创建分区表 hive (defau…...
让高分辨率的相机芯片输出低分辨率的图片对于像素级的值有什么影响?
很多图像传感器可以输出多个分辨率的图像,如果选择低分辨率格式的图像输出,对于图像本身会有什么影响呢? 传感器本身还是使用全部像素区域进行感光,但是在像素数据输出时会进行所谓的降采样(down-sampling)…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
