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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java面试八股之组合、聚合和关联三者的区别是什么

组合、聚合和关联三者的区别是什么 关联&#xff08;Association&#xff09;: 最基本的一种关系&#xff0c;表示一个类知道另一个类的存在&#xff0c;或者说是类之间的某种联系。 关联可以是双向的也可以是单向的&#xff0c;且不规定参与关联的对象的生存周期。 实例&a…

MySQL数据库(详解)

目录 前言 一、数据库的基本概念 1.数据(Data) 2.表 3.数据库 4.数据库管理系统(DBMS) 5.数据库系统 二、数据库系统发展史 1.第一代数据库 2.第二代数据库 3.第三代数据库 三、当今主流数据库介绍 1.SQL Server (微软公司产品) 2.Oracle (甲骨文公司产品) 3.DB…

SwiftUI中Mask修饰符的理解与使用

Mask是一种用于控制图形元素可见性的图形技术&#xff0c;使用给定视图的alpha通道掩码该视图。在SwiftUI中&#xff0c;它类似于创建一个只显示视图的特定部分的模板。 Mask修饰符的定义&#xff1a; func mask<Mask>(alignment: Alignment .center,ViewBuilder _ ma…

地图之战争迷雾/地图算法/自动导航(一)

战争迷雾 TiledMap 创建黑色覆盖块&#xff0c;然后使用碰撞组件&#xff0c;控制黑色块的显示和隐藏 地图算法 在有些游戏中&#xff0c;地图需要随机生成&#xff0c;比如游戏中的迷宫等&#xff0c;这就需要地图生成的算法&#xff1b;在角色扮演类游戏中&#xff0c;角色…

「Qt Widget中文示例指南」如何实现一个简单的RHI小部件示例(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文将为大家演示如…

阿里大模型又又又又开源了!这次还是王炸产品!

阿里大模型又双叒叕开源了&#xff1a;刚刚&#xff0c;Qwen2 宣布开源&#xff01; 不到一年时间&#xff0c;阿里云通义千问先后开源近 10 款不同尺寸的大语言模型&#xff0c;之前开源的 Qwen 系列 72B、110B 模型就曾多次登顶 HuggingFace 的 Open LLM Leaderboard 开源模型…

两个不同的TA Instance之间可以共享全局变量吗

答案&#xff1a;不能。 在GP规范里其实是有规定&#xff0c;在不同的TA Instance之间&#xff0c;都是有着各自的physical memory space的&#xff0c;都是相互独立物理地址空间的。 不同的TA instance之间&#xff0c;各自拥有各自的堆空间、可写全局数据段、可写静态数据段。…

Python可视化 | 使用matplotlib绘制面积图示例

面积图是数据可视化中的一个有效工具&#xff0c;用于说明时间上的关系和趋势。它们提供了一种全面的、视觉上迷人的方法&#xff0c;通过熟练地将折线图的可读性与填充区域的吸引力相结合来呈现数值数据。 在本文中&#xff0c;我们将学习更多关于在Python中创建面积折线图的…

前端渲染大量数据思路【虚拟列表】【异步机制】

当浏览器遇到性能瓶颈导致页面卡顿时&#xff0c;你会怎么处理&#xff1f;如何查找问题的原因&#xff1f; 浏览器本身自带性能检测工具&#xff0c;通常我们分析由脚本导致的页面卡顿会选择 性能&#xff08;performance&#xff09; 选项卡&#xff0c;在其中我们可以找到导…

从诺曼底登陆八十周年说起

昨天&#xff08;2024年6月6日&#xff09;是诺曼底登陆&#xff08;Normandy Campaign&#xff09;八十周年纪念日。媒体上有很多对相关纪念活动的报道。 诺曼底登陆战役&#xff0c;是第二次世界大战也是世界战争史上规模最大的登陆战役。敦刻尔克大撤退后&#xff0c;西欧大…

Qt Window Dialog 无标题栏 ,无边框,可拖动

1.效果&#xff1a; 2. 主要实现步骤&#xff1a; 设置窗口 flag&#xff1a; this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); 创建变量存储位置 QPoint m_dragPosition; 对鼠标左键按下和移动事件做处理 void DraggableDialog::mousePre…

【Linux操作系统】Linux中进程的五种状态:R、S、D、T、X以及僵尸进程、孤儿进程

操作系统中有许多同时执行的进程&#xff0c;这些进程都可能处于不同的状态代表着不同的含义。 R运行状态(running) 概念&#xff1a;并不意味着进程一定在运行中&#xff0c;它表明进程要么是在运行中要么在运行队列里。 我们运行可执行程序myproc利用指令 ps ajx可以看到进程…

Java 18 新功能概述

Java 18 在 2022 年 3 月 22 日正式发布&#xff0c;Java 18 不是一个长期支持版本。 包含多项新特性和改进&#xff0c;如文件系统链接、文本块、表达式求值API、ForkJoinPool优化、Optional新方法等。 亮点还包括预览特性&#xff1a;Record Pattern Matching for Switch和增…

Elastic Search(ES)Java 入门实操(3)数据同步

基本概念和数据查询代码&#xff1a; Elastic Search &#xff08;ES&#xff09;Java 入门实操&#xff08;1&#xff09;下载安装、概念-CSDN博客 Elastic Search&#xff08;ES&#xff09;Java 入门实操&#xff08;2&#xff09;搜索代码-CSDN博客 想要使用 ES 来查询数…

为什么会有虚像

本来我就打算写虚像相关的内容&#xff0c;实际上我看不懂光学的内容&#xff0c;我只是发觉书上没有使用变分法来做&#xff0c;而只是解析几何的变换&#xff0c;这个做法完全脱离实际&#xff0c;物理书为什么会这样写不知道原因&#xff0c;但是很明显这样的内容也非常的复…

操作系统复习-存储管理之段页式存储管理

存储管理之段页式存储管理 页式存储管理(等分划分) 字块是相对物理设备的定义页面则是相对逻辑空间的定义指的都是大小一样的一块内存页式存储管理是将进程逻辑空间等分成若干大小的页面相应的把物理内存空间分成与页面大小的物理块以页面为单位把进程空间装进物理内存中分散的…

【MySQL】常见可执行程序

本文使用的版本是MySQL8&#xff0c;5.7可能会有所不同。 MySQL提供了一些重要的程序用来管理和操作数据库。这里会介绍一些常用的程序及其使用。对于MySQL程序的使用&#xff0c;可以查看官方帮助手册来学习。 MySQL :: MySQL 8.0 Reference Manual :: 6 MySQL Programs 程序…

normalizing flows vs 直方图规定化

normalizing flows名字的由来 The base density P ( z ) P(z) P(z) is usually defined as a multivariate standard normal (i.e., with mean zero and identity covariance). Hence, the effect of each subsequent inverse layer is to gradually move or “flow” the da…

C# Maui 报错:程序“[15748] MauiApp1.exe”已退出,返回值为 2147942405 (0x80070005)

“MauiApp1.exe”(CoreCLR: DefaultDomain): 已加载“C:\Program Files\dotnet\shared\ Microsoft.NETCore.App\8.0.6\System.Private.CoreLib.dll”。 “MauiApp1.exe”(CoreCLR: clrhost): 已加载“E:\cDemo\MauiApp1\MauiApp1\bin\Debug\net8.0-windows10.0.19041.0\win10-x…

数智融通 创新发展|亚信科技携AntDB、Data OS与隐私计算产品,赋能企业高质量发展

5月21日&#xff0c;亚信科技在云端举办了一场别开生面的研讨会——“数智融通 创新发展”&#xff0c;聚焦企业数智化升级的前沿话题。资深产品经理和技术架构师们面对面深入交流&#xff0c;分享创新成果与实战案例&#xff0c;共同探索企业数智化转型的新路径。 图1&#xf…