【C++课程学习】:new和delete为什么要配套使用,new,delete和malloc,free的比较

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

目录

🎡1.new,delete和malloc,free的区别:

⌚️相同点:

⌚️不同点:

🎡2.new和free的实现原理:

1.对内置类型的处理:

2.对自定义类型的处理:

🎡3.为什么尽量要new和delete配套使用,malloc(calloc,realloc)和free配套使用?


🎡1.new,delete和malloc,free的区别:

⌚️相同点:

new,delete和malloc,free都是对动态内存进行管理的。动态内存是位于堆上的,不会随着函数生命周期的结束而结束,正因为这样,所以才要用户主动的进行空间释放。不然就会造成空间泄露。

●空间泄露:不是物理层面的消失,而是我们失去对某块空间的控制。

危害:长期运行的程序出现内存泄漏会使反应越来越慢,最终卡死。

⌚️不同点:

🏆1.new,delete是操作符,malloc,free是函数

🥊操作符和函数的区别:

1.操作符在编译的过程就进行了替代,而函数要在运行中进行调用。

2.操作符不需要要有头文件,由编译器实习,而函数必须要有具体实现。

🏆2.是否能进行初始化:

malloc不可以进行初始化。new可以进行初始化,也可以不进行初始化。


🏆3.是否需要进行类型转化:

malloc申请的空间是void*,所以要进行类型转化,new申请的空间里面有类型,不需要进行转化。


🏆4.空间大小的计算:

malloc要明确申请空间的大小(单位:字节),但是new只要明确申请几个就可以了,申请多个时,在类型后面加[个数]。


🏆5.是否主动调用构造函数和析构函数:

在处理自定义类型的时候,new会调用构造函数,delete会主动调用析构函数对类里面的空间进行清理。但是malloc和free就不会调用。


🏆6.申请失败的返回值不同: 

malloc申请失败的时候返回NULL指针,所以申请完以后,要进行判空。new需要捕获异常

🎡2.new和free的实现原理:

1.对内置类型的处理:

从下面的例子也可以看出来,new可以对申请的空间进行初始化。malloc不能对申请的空间进行初始化,calloc虽然可以初始化,但是都是0,不能根据具体的实际情况进行初始化,所以也是不能初始化。

#include<iostream>
using namespace std;int main()
{//申请一个int空间int* p1 = new int(10);//malloc申请空间的大小,不进行初始化int* p2 = (int*)malloc(sizeof(int));//calloc进行初始化,每个字节都初始化为0int* p3 = (int*)calloc(1, sizeof(int));//对空间进行扩容,如果为空指针,功能相当于mallocint* p4 = (int*)realloc(nullptr, sizeof(int));//申请多个int空间,后面跟着初始化列表int* p5 = new int[5] {1, 2, 3};free(p2);delete p1;//释放多个空间的时候,用delete[] 指针delete[] p5;
}

2.对自定义类型的处理:

在自定义这个层面,new和malloc的区别就不止有new可以进行初始化,还有new会主动调用构造函数,delete会调用析构函数。

#include<iostream>
using namespace std;class A {
public:A() {cout << "A()" << endl;}~A() {cout << "~A()" << endl;}
private:int _a;
};
int main()
{A* p1 = new A;delete p1;cout << "aaa" << endl;A* p2 = (A*)malloc(sizeof(A));free(p2);cout << "aaa" << endl;return 0;
}

3.原理:

⌚️new的原理:

1.operator  new函数申请空间

2.在申请的空间上调用构造函数。

⌚️delete的原理:

1.执行析构函数对对象中的资源进行清理。

2.调用operator delete对对象进行清理


new T[ ]和delete[ ]原理和上面类似。

operator new和operator delete是系统提供的全局函数,底层还是通过malloc和free进行实现的。

🎡3.为什么尽量要new和delete配套使用,malloc(calloc,realloc)和free配套使用?

因为我们如果下面这种情况下,如果是new申请的空间,用free进行释放空间,就会发生错误。

⌚️在类里面我们显式实现了析构函数的时候,用new申请多个类对象的时候,会多申请4个字节(一个int类型的大小)保存申请了多少个类。

#include<iostream>
using namespace std;class A {
public:~A() {cout << "~A()" << endl;}
private:int _a;
};
int main()
{A* p1 = new A[10];A* p2 = (A*)malloc(sizeof(A) * 10);return 0;
}

这时候申请的大小是:4*10+4=44字节

但是如果没有显式实现析构函数,就不要那多出来的四个字节来保存申请了多少个类。

但是new申请的空间返回的是多申请的那四个字节的后面那10个A空间起始位置。

如果我们直接用free释放这一位置,前面多申请的那四个就没有被释放,就发生内存泄漏。

 

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

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

相关文章

Java的SpringBoot项目中为什么要注入接口XxxService而不是具体的实现类XxxServiceImpl

Java的SpringBoot项目中为什么要注入接口XxxService而不是具体的实现类XxxServiceImpl 在 Java 中&#xff0c;通常建议面向接口编程。注入一个接口而不是具体的实现类有以下几个好处&#xff1a; **解耦&#xff1a;**通过注入接口&#xff0c;实现了服务的调用者&#xff08…

“删错文件后如何高效挽救?两大恢复策略全解析“

在数字化日益深入生活的今天&#xff0c;数据已成为我们工作、学习和娱乐不可或缺的一部分。然而&#xff0c;删错文件的经历却如同数字世界中的一场“小插曲”&#xff0c;不经意间就可能让我们陷入数据丢失的困境。无论是误触删除键、清空回收站&#xff0c;还是软件故障导致…

GCN-LSTM实现时空预测

简介:现有的预测模型越来考虑时间和空间的相关性,统称为时空预测。这种预测模型往往比简单的序列模型(例如RNN、LSTM、GRU及其变体)、Transformer等效果更好。我使用Keras实现了该GCN-LSTM代码,因为Keras相比于torch更容易入手和理解。我实现了一个基于Keras的GCN网络层,…

Linux 宝塔常用命令教程

一、引言 在 Linux 服务器管理中&#xff0c;宝塔面板是一款非常实用的工具。然而&#xff0c;了解一些相关的命令可以让我们在特定情况下更高效地进行操作和管理。本文将为您介绍一些常用的 Linux 宝塔相关命令。 二、安装宝塔面板 首先&#xff0c;如果您还未安装宝塔面板…

数据结构(其一)--基础知识篇

目录 1. 数据结构三要素 1.1 数据结构的运算 1.2 数据结构的存储结构 2. 数据类型&#xff0c;抽象数据类型 3. 算法 3.1 时间复杂度T(n) 3.2 空间复杂度 1. 数据结构三要素 1.1 数据结构的运算 即&#xff0c;增删改查 1.2 数据结构的存储结构 2. 数据类型&#xff0…

企业微信群发限制的背后逻辑,一文读懂!

在数字化营销日益盛行的今天&#xff0c;企业微信作为一款专为企业设计的通讯与办公工具&#xff0c;凭借其与微信的无缝对接和丰富的功能&#xff0c;成为了众多企业开展私域流量运营的重要平台。然而&#xff0c;在使用企业微信的群发功能时&#xff0c;用户往往会遇到一定的…

视觉语言模型导论:这篇论文能成为你进军VLM的第一步

近些年&#xff0c;语言建模领域进展非凡。Llama 或 ChatGPT 等许多大型语言模型&#xff08;LLM&#xff09;有能力解决多种不同的任务&#xff0c;它们也正在成为越来越常用的工具。 这些模型之前基本都局限于文本输入&#xff0c;但现在也正在具备处理视觉输入的能力。如果…

录屏软件免费推荐,拥有这4款,不花一分钱

在这个充满创意与活力的数字时代&#xff0c;录屏软件早已成为我们探索世界、分享生活的必备神器。但市面上却存在很多收费的录屏软件&#xff0c;让人望而却步。那么有没有一些录屏软件免费帮助我们轻松开启录影人生&#xff0c;尽情展现创意与才华呢&#xff1f; 本文就将带…

痉挛性斜颈是中医治疗好还是西医好呢?你有真正了解吗?

痉挛性斜颈是西医治疗好还是中医治疗好 痉挛性斜颈&#xff0c;是由于中枢神经系统异常冲动引起的颈部肌群阵发性不自主收缩&#xff0c;使头颈向一侧扭转或痉挛性倾斜。 痉挛性斜颈的病因&#xff0c;多数是由于脑深部的神经细胞病变引起的。这些病人可以有脑炎、出生时窒…

光电门验证动量守恒实验

本实验所需器件与第二个实验相同。但是连线方式有所区别&#xff0c;先将Arduino的电源输出接到两个光电门&#xff0c;然后再将光电门1的信号输出线接到Arduino的第10个端口&#xff0c;光电门2的信号输出线接到Arduino的第11个端口。对Arduino写入下列程序&#xff08;只有主…

ELK集群搭建

ELK集群搭建 文章目录 ELK集群搭建1.环境准备2.Elasticsearch环境搭建1.创建es账户并设置密码2.选择对应版本进行下载3.编辑配置文件4.设置JVM堆大小 #7.0默认为4G5.创建es数据及日志存储目录6.修改安装目录和存储目录权限 3.系统优化1.增加最大文件打开数2.增加最大进程数3.增…

有了HTTP,为什么还需要HTTPS?

一、HTTPS的重要性 背景&#xff1a;互联网时代信息传播快&#xff0c;互动便捷&#xff0c;但数据安全和个人隐私保护问题日益突出。普及趋势&#xff1a;HTTPS协议因其安全性和隐私保护功能而成为互联网发展的必然选择。 二、HTTPS相较于HTTP的优势 安全性 HTTP&#xff1a…

(3)滑动窗口算法练习:最长连续1的个数Ⅲ

最长连续1的个数Ⅲ 题目链接&#xff1a;1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09; 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 示例 1&#xff1a; 输入&#xff1a…

【GreenHills】GHS-Servecode的查看和说明

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 在Green Hills客户申请license试用以及正式文件的Servecode编号会有不同&#xff0c;该文档对此进行说明并如何主动查看Servecode&#xff0c;并且说明Servecode的类别&#xff0c;通过Servecode了解客户授权情况。 …

【机器学习】初学者经典案例(随记)

&#x1f388;边走、边悟&#x1f388;迟早会好 一、概念 机器学习是一种利用数据来改进模型性能的计算方法&#xff0c;属于人工智能的一个分支。它旨在让计算机系统通过经验自动改进&#xff0c;而不需要明确编程。 类型 监督学习&#xff1a;使用带标签的数据进行训练&…

spring boot 3.2.x 使用CDS加速启动

maven 配置 业务包和依赖包分离 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable><la…

2-30 基于matlab的神经网路下身份证号码识别算法

基于matlab的神经网路下身份证号码识别算法&#xff0c;二值化、膨胀处理、边界区域划分、身份证字符分割&#xff0c;字符识别算法&#xff0c;输出识别结果。并保存识别结果。程序已调通&#xff0c;可直接运行。 2-30 神经网络 身份证识别 图像处理 - 小红书 (xiaohongshu.c…

FastAPI 学习之路(四十)后台任务

我们在实际的开发中&#xff0c;都会遇到&#xff0c;我们要执行的一些任务很耗时&#xff0c;但是对于前端&#xff0c;没必要进行等待。比如发送邮件&#xff0c;读取文件。我们在fastapi如何实现呢。 其实很简单&#xff0c;fastapi已经给我们封装好一个现成的模块&#xff…

4款免费国产开源软件,功能过于强大,常被认为是外国人开发

之前小编分享了一些良心的电脑软件&#xff0c;大部分都是国外的开源软件&#xff0c;就有部分同学在后台说小编有点极端了&#xff0c;国内也是有良心的电脑软件的。 本期就是国产软件专场&#xff0c;今天就给大家推荐几款良心的国产电脑软件&#xff0c;说真的&#xff0c;…

UNIAPP_ReferenceError: TextEncoder is not defined 解决

错误信息 1、安装text-decoding npm install text-decoding2、main.js import { TextEncoder, TextDecoder } from text-decoding global.TextEncoder TextEncoder global.TextDecoder TextDecoder