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

news2025/1/17 23:26:40

1、内存的分配与回收

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

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

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

单个分配、回收

 //在堆区申请了int类型的大小空间,并将该空间的地址赋值给p1
    int *p1 = new int;
    cout << *p1 << endl;

  //在堆区申请了int类型的大小空间,并且初始化为10
    int *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.coloradmin.cn/o/1790617.html

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

相关文章

四川汇聚荣聚荣科技有限公司综合实力怎么样?

在科技日新月异的今天&#xff0c;企业的综合实力成为衡量其市场竞争力的重要指标。四川汇聚荣聚荣科技有限公司作为一家在行业内具有一定影响力的企业&#xff0c;其综合实力如何&#xff0c;自然成为外界关注的焦点。以下将从多个维度深入分析该公司的实力。 一、公司概况与核…

ChatGPT制作一个简单的客服机器人

包含功能&#xff1a; MVP&#xff08;最简可行产品&#xff09;版本的客服机器人应该聚焦于核心功能&#xff0c;以快速上线和测试用户反馈为目标。以下是一个简化的版本&#xff1a; 自动问答&#xff08;FAQ&#xff09;功能&#xff1a; 支持回答常见问题&#xff0c;例如…

一键分割视频并生成M3U8格式:高效管理视频内容,畅享流畅播放新体验

视频内容已成为我们日常生活和工作中的重要组成部分。无论是个人分享生活点滴&#xff0c;还是企业宣传产品与服务&#xff0c;视频都以其直观、生动的形式&#xff0c;吸引着我们的眼球。然而&#xff0c;随着视频内容的不断增多&#xff0c;如何高效、便捷地管理这些视频&…

虚幻引擎5 Gameplay框架(四)

Gameplay重要类及重要功能使用方法&#xff08;三&#xff09; 虚幻的委托机制 虚幻委托之间的区别序列化就是是否可以在蓝图中执行 多播与单播的创建 制作功能&#xff1a;使用多播与单播将血条与血量进行实时更新首先新建一个单播与一个多播委托 实例化这两个委托的标签…

6.5 作业

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class Stu { privat…

低温测控芯片迎来突破性进展!

为支持大规模超导量子计算机的开发&#xff0c;日本最大的公共研究机构之一国家先进工业科学与技术研究所 (AIST) 的研究人员与横滨国立大学、东北大学&#xff08;日本国立大学之一&#xff09;和NEC公司合作&#xff0c;提出并成功演示了一种可在低温下控制许多量子比特的超导…

CSAPP Lab08——Proxy Lab完成思路

蓝色的思念 突然演变成了阳光的夏天 空气中的温暖不会很遥远 ——被风吹过的夏天 完整代码见&#xff1a;CSAPP/proxylab-handout at main SnowLegend-star/CSAPP (github.com) Q&#xff1a;计算机网络中port的作用是什么&#xff1f; A&#xff1a;在计算机网络中&#xff…

下载安装Grafana 监控mysql和Linux主机

下载地址:https://grafana.com/grafana/download [rootlocalhost ~]# wget https://dl.grafana.com/oss/release/grafana-7.2.0- 1.x86_64.rpm 安装 [rootlocalhost ~]# yum install grafana-7.2.0-1.x86_64.rpm -y启动服务 [rootlocalhost ~]# systemctl enable --now grafa…

AST 在前端开发中的应用与实践:从代码分析到自动化转换

抽象语法树&#xff08;AST&#xff0c;Abstract Syntax Tree&#xff09;在前端开发中有着广泛的应用。它是编译器和工具链的核心组件&#xff0c;使得代码分析、转换、优化等操作成为可能。在前端开发中&#xff0c;AST 主要用于代码编译和转译、代码优化、代码分析、代码格式…

C语言数字全排列生成器

前言 从0开始记录我的学习历程&#xff0c;我会尽我所能&#xff0c;写出最最大白话的文章&#xff0c;希望能够帮到你&#xff0c;谢谢。 提示&#xff1a;文章作者为初学者&#xff0c;有问题请评论指正&#xff0c;感谢。 这个代码的功能是生成并打印出从1到N的所有整数的…

Allegro-开店指南

开店指南 Allegro企业账户注册流程 Allegro注册流程分成两个主要阶段: 第一创建您的账户&#xff0c;第二激活您账户的销售功能。完成两个阶段&#xff0c;才能在Allegro进行销售。 中国企业应该入驻Business account&#xff08;企业账户&#xff09;。 第二阶段&#xff…

nginx中配置ssl证书(宝塔面板)

首先申请一个SSL证书&#xff0c;这里我申请的joyssl的免费证书。提交订单申请后&#xff0c;按照页面提示在域名解析中将CNAME和记录值配置好。 比如我用的阿里云&#xff0c; 这是好后&#xff0c;需要等几分钟&#xff0c;然后域名检验成功。 然后点击joyssl的左侧菜单的“证…

【新书上市】图像画质算法与底层视觉技术

图书主页&#xff1a;https://book.douban.com/subject/36895899/ 购买链接&#xff1a;https://item.jd.com/10105601481762.html 内容介绍 本书主要介绍了图像画质相关的各类底层视觉任务及其相关算法&#xff0c;重点讲解了去噪、超分辨率、去雾、高动态范围、图像合成与图…

conflicting types for 错误问题

操作系统真象还原中&#xff0c;第十一章出现的问题&#xff1a; 怎样编译都会出现一个conflicting types for ’xxx‘的错误 出现这个错误的原因&#xff1a; 头文件声明和定义参数稍有不同 头文件中声明 void Hanlder(const char * buf); 在定义时写作 void Hanlder(char…

双指针法 ( 三数之和 )

题目 &#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

嵌入式 Linux LED 驱动开发实验学习

I.MX6U-ALPHA 开发板上的 LED 连接到 I.MX6ULL 的 GPIO1_IO03 这个引脚上&#xff0c;进行这个驱动开发实验之前&#xff0c;需要了解下地址映射。 地址映射 MMU 全称叫做 MemoryManage Unit&#xff0c;也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU&#x…

Amazon云计算AWS(一)

目录 一、基础存储架构Dynamo&#xff08;一&#xff09;Dynamo概况&#xff08;二&#xff09;Dynamo架构的主要技术 二、弹性计算云EC2&#xff08;一&#xff09;EC2的基本架构&#xff08;二&#xff09;EC2的关键技术&#xff08;三&#xff09;EC2的安全及容错机制 提供的…

NXP i.MX8系列平台开发讲解 - 3.14 Linux 之Power Supply子系统(二)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 1. 前言 2. 芯片简介 2. 系统原理设计 2. 设备树相关 本文实操是基于Android11 系统下i.MX8MQ环境下&#x…

DKTCDR:Domain-Oriented Knowledge Transfer for Cross-Domain Recommendation

Domain-Oriented Knowledge Transfer for Cross-Domain Recommendation IEEE(CCF B.SCI 1)-Guoshuai Zhao, Xiaolong Zhang, Hao Tang, Jialie Shen, and Xueming Qian-2024 思路 在CDR中,构建连接两个域的桥梁是实现跨域推荐的基础。然而现在的CDR方法往往在连接两个域时忽…

STM32-- GPIO->EXTI->NVIC中断

一、NVIC简介 什么是 NVIC &#xff1f; NVIC 即嵌套向量中断控制器&#xff0c;全称 Nested vectored interrupt controller 。它 是内核的器件&#xff0c;所以它的更多描述可以看内核有关的资料。M3/M4/M7 内核都是支持 256 个中断&#xff0c;其中包含了 16 个系统中…