嵌入式学习——4——C++中的动态内存分配和回收(堆区)

1、内存的分配与回收

C语言中使用的是mallocfree函数进行动态内存分配和回收的。

C++中依然可以使用上述的两个函数来完成动态内存分配和回收的。

C++也给用户提供了两个关键字newdelete来完成动态内存分配和回收的

单个分配、回收

 //在堆区申请了int类型的大小空间,并将该空间的地址赋值给p1int *p1 = new int;cout << *p1 << endl;//在堆区申请了int类型的大小空间,并且初始化为10int *p2 = new int(10);cout << *p2 << endl;//单个回收delete p1;delete p2;p1 = nullptr;p2 = nullptr;

连续分配、回收

   //在堆区空间连续申请了5个int大小的空间int *p4 = new int[5];//连续回收delete []p4;p4 = nullptr;//在堆区空间连续申请了5个int大小的空间,并且初始化int *p5 = new int[5]{100,200,300,400,500};//连续回收delete []p5;p5 = nullptr;

new、delete和malloc、free之间的区别

1、new、delete是关键字,而malloc和free是函数

2、new申请空间时,可以初始化。而malloc不可以。

3、 new申请空间以数据类型为单位,而malloc是以字节为单位。

4、 指针是什么数据类型,new就是申请什么数据类型。而malloc申请空间的返回值是void*,使用是需要强转。

5、 new申请空间delete释放空间,区分格式。而malloc和free不区分。

6、 new申请类对象空间时,会自动调用构造函数,而malloc不会自动调用。

7、 delete释放类对象空间时,会自动调用析构函数,而free不会自动调用。

2、类中特殊的成员函数

1、特殊成员函数的种类:构造函数、析构函数、拷贝构造函数、拷贝赋值函数

2、特殊的原因:

         2.1、这些函数无需程序员手动定义,系统会默认提供。如果程序员手动定义了,那么系统会取消默认提供(相当于屏蔽掉了)。

         2.2、这些函数无需手动调用,会在特殊的情况下,自动调用。

构造函数

当实例化一个对象时,给类对象申请空间初始化使用的。

类名(参数列表) {

        函数体内容

}

无返回值

访问权限:一般为public

调用时机

栈区:何时实例化对象,何时自动调用构造函数

堆区:何时使用new申请类对象空间,何时自动调用构造函数

初始化列表

构造函数本身是完成申请空间的,而初始化工作是交给初始化列表来完成的。

类名(形参1,形参2,...,形参n):成员变量1(形参1),成员变量2(形参2)..,成员变量n(形参n) {

        函数体内容;

}

注意:只有构造函数才有初始化列表。

当类有嵌套时,调用构造函数的顺序

1、 先调用成员的构造函数

2、 再调用自己的构造函数

析构函数

当类对象生命周期结束时,自动调用析构函数,来给类对象回收资源(释放空间)。

~类名() {

        函数体内容;

}

无参无返

访问权限:一般为public

调用时机

栈区:当类对象所在的函数结束时,自动调用析构函数来释放空间。

堆区:何时使用delete释放类对象,何时自动调用析构函数

注意

1、 系统会提供一个默认的析构函数,当程序员手动定义析构函数时,系统会取消默认提供。

2、 当类中有指针成员,并且申请堆区空间时,此时需要显性定义出析构函数,在析构函数中手动释放指针成员申请的空间,否则会造成内存泄漏。

3、 每个类中只能有一个析构函数(原因:无参)

上图情况需要在析构函数内部释放指针(delete price)

练习

设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数
#include <iostream>using namespace std;/** 设计一个Per类,类中包含私有成员:姓名、年龄、指针成员身高、体重,再设计一个Stu类,* 类中包含私有成员:成绩、Per类对象p1,设计这两个类的构造函数、析构函数
*/
class Person {
private:string name;int age;double *height;double *weight;
public:Person(){}Person(string name, int age, double height, double weight):name(name),age(age),height(new double(height)),weight(new double(weight)){}~Person(){delete height;delete weight;};void show(){cout << "Person this == " << this << endl;cout << name << " " << age << " " << *height << " " << *weight << endl;}
};class Stu {
private:double score;Person per;
public:Stu(){}Stu(double score, string name, int age, double height, double weight):score(score),per(name, age, height, weight){}~Stu(){}void show(){cout << score << endl;cout << "Stu this == " << this << "   per == " << &per << endl;per.show();}
};int main()
{// 栈区Stu s1;Stu s2(99.5, "张三", 22, 178, 150);s2.show();// 堆区Stu *p1 = new Stu;Stu *p2 = new Stu(98.5, "李四", 21, 160, 130);p2->show();delete p1;delete p2;return 0;
}

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

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

相关文章

html--圣诞树

将以下代码保存到txt文件中&#xff0c;并改名为xx.html <html> <head> <title>圣诞树</title> <meta charset"utf-8" > <style> html, body { width: 100%; height: 100%; margin: 0; padding: 0; border: 0; } div { margin: …

Java--命令行传参

1.有时你希望运行一个程序时再传递给它消息&#xff0c;这要靠传递命令行参数给main&#xff08;&#xff09;函数实现 2.选中文件右键找到如图选项并打开 3.在文件地址下输入cmd空格符号&#xff0c;再按回车调出命令窗口 4.如图一步步进行编译&#xff0c;在向其传入参数&…

echarts柱状图的背景动态效果

这里的动态效果实现原理&#xff0c;就是相当于柱状图多了一组同系列数据&#xff0c;其值与数组展示数据一致&#xff08;类似下图&#xff09; 即&#xff0c;柱形图的每一个柱体都有它对应的另外一个柱体 其中白色柱体要与展示柱体重合&#xff0c;效果类似与给柱体做背景…

IEDA 默认依赖概述

IEDA 默认依赖概述 目录概述需求&#xff1a; 设计思路实现思路分析1.AI Azure OpenAlAzure Al SearchAmazon BedrockChroma Vector DatabaseMilvus Vector DatabaseMistral AlNeo4J Vector DatabaseOllamaOpenAlPGvector Vector DatabasePinecone Vector DatabasePostgresMLRe…

Java抽象队列同步器AQS

AQS介绍 AQS是一个抽象类&#xff0c;主要用来构建锁和同步器。 public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { }AQS为构建锁和同步器提供了一些通用功能的实现&#xff0c;因此&#xff0c;使用…

关于音乐播放器与系统功能联动功能梳理

主要实现功能&#xff1a; 一、通知栏播放显示和控制 二、系统下拉栏中播放模块显示同步 三、与其他播放器状态同步&#xff1a;本应用播放时暂停其他应用播放&#xff0c;进入其他应用播放时&#xff0c;暂停本应用的后台播放 通知栏播放的显示和控制&#xff1a; 通过Not…

数字人实战第一天——最新数字人MuseTalk效果展示

最新数字人MuseTalk效果展示 MuseTalk 是由腾讯团队开发的先进技术&#xff0c;项目地址&#xff1a;GitHub - TMElyralab/MuseTalk: MuseTalk: Real-Time High Quality Lip Synchorization with Latent Space Inpainting&#xff0c;它是一个实时的音频驱动唇部同步模型。该模…

简单通用的系统安装、备份、还原方法,支持 ARM 系统【Ventory+FirePE+DiskGenius】

文章目录 0. 简介1. 制作 Ventory 启动盘1.1. 下载 Ventory1.2. 制作 Ventory 启动盘 2. 添加 FirePE 等系统镜像到启动盘2.1. 下载 FirePE2.2. 导出 .iso 系统镜像文件2.3. .iso 系统镜像文件添加至启动盘 3. 启动 FirePE 等系统镜像3.1. 在 bios 中选择启动盘启动3.2. 启动系…

访问网站时IP被阻止?原因及解决方法

在互联网上&#xff0c;用户可能会面临一个令人困扰的问题——当尝试访问某个特定的网站时&#xff0c;却发现自己的IP地址被该网站屏蔽。 IP地址被网站屏蔽是一个相对常见的现象&#xff0c;而导致这种情况的原因多种多样&#xff0c;包括恶意行为、违规访问等。本文将解释IP地…

大学搜题软件网课?推荐五个搜题软件和学习工具 #其他#经验分享#知识分享

大学生活中&#xff0c;选择适合自己的学习工具能够提高学习效率&#xff0c;让学习更加轻松愉快。 1.彩虹搜题 这个是公众号 提供了各大教材以及网课平台的练习题答案&#xff0c;强大的平台支持&#xff0c;无论是智慧树还是MOOC&#xff0c;只有老师们用不到&#xff0c;…

理解JVM内存模型与Java内存模型(JMM)

理解JVM内存模型与Java内存模型&#xff08;JMM&#xff09; 在Java程序的运行过程中&#xff0c;内存管理和线程的同步是两个重要的概念。本文将深入探讨JVM内存模型&#xff08;Java Virtual Machine Memory Model&#xff09;和JMM&#xff08;Java Memory Model&#xff0…

实现开源可商用的 ChatPDF RAG:密集向量检索(R)+上下文学习(AG)

实现 ChatPDF & RAG&#xff1a;密集向量检索&#xff08;R&#xff09;上下文学习&#xff08;AG&#xff09; RAG 是啥&#xff1f;实现 ChatPDF怎么优化 RAG&#xff1f; RAG 是啥&#xff1f; RAG 是检索增强生成的缩写&#xff0c;是一种结合了信息检索技术与语言生成…

型号FM152A,FM148R和利时

型号FM152A,FM148R和利时。控制系统的仿真,综合考虑多方面的因素,本文将用MCGS组态软件设计一个仿真实验监控平台来对其进行实时控制.&#xff0c;完成仿真实验监控平台的设计,型号FM152A,FM148R和利时。最终达到对水箱液位实时监控,实验数据采集,报表的输出和数据的同步显示MC…

Live800:深度解析,客户服务如何塑造品牌形象

在当今竞争激烈的市场环境中&#xff0c;品牌形象对于企业的成功至关重要。而客户服务作为品牌与消费者之间最直接的互动方式&#xff0c;不仅影响着消费者的购买决策&#xff0c;更在塑造品牌形象方面发挥着不可替代的作用。本文将深度解析客户服务如何塑造品牌形象&#xff0…

【Unity3D小功能】Unity3D中UGUI-Text实现打字机效果

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 需求要实现Text的打字机效果&#xff0c;一看居然…

机器学习作业6——svm支持向量机

目录 一、理论 概念&#xff1a; 线性可分&#xff1a; 支持向量&#xff1a; 间隔&#xff1a; 目标&#xff1a; 软间隔&#xff1a; 梯度下降法&#xff1a; 别的方法&#xff1a; 拉格朗日函数&#xff1a; SMO算法&#xff1a; 核函数&#xff1a; 二、代码 …

python代码中参数的默认值

python中的函数&#xff0c;可以给形参指定默认值。 带有默认值的参数&#xff0c;可以在调用的时候不传参。 如上图所示&#xff0c;在给函数设定形参的时候可以给函数形参设定默认值&#xff0c;当然默认参数的形参应该在非默认形参的后面。 如果在调用函数的时候&#xff…

Linux云计算架构师涨薪班就业服务有哪些?

学员一站式就业服务:一次学习&#xff0c;薪资翻倍 简历制作与指导 学员在培训期间&#xff0c;人才顾问会提供简历制作和指导服务&#xff0c;帮助学员制作出一份专业、有吸引力的简历。简历是求职者给招聘单位的第一印象&#xff0c;因此非常重要 模拟面试与技巧指导 为了让…

WebGPU 引领前端未来,互动渲染如何驱动小红书业务增长?

在大前端时代&#xff0c;浏览器能力得到显著的增强&#xff0c;为前端开发带来了更多的可能性和挑战。作为一套全新的 Web API 标准&#xff0c;WebGPU 旨在提供高性能的 3D 图形和数据并行计算能力&#xff0c;其在游戏、虚拟现实、机器学习等多个行业和应用场景中展现出潜力…

嵌入式Linux系统编程 — 3.2 stat、fstat 和 lstat 函数查看文件属性

目录 1 文件有哪些属性 2 stat函数 2.1 stat函数简介 2.2 struct stat 结构体 2.3 struct timespec 结构体 2.4 示例程序 3 fstat 和 lstat 函数 3.1 fstat 函数 3.2 lstat 函数 1 文件有哪些属性 Linux文件属性是对文件和目录的元数据描述&#xff0c;包括文件类型…