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

news2024/10/8 13:41:54

🎁个人主页:我们的五年

🔍系列专栏: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进行初始化,每个字节都初始化为0
	int* p3 = (int*)calloc(1, sizeof(int));

	//对空间进行扩容,如果为空指针,功能相当于malloc
	int* 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.coloradmin.cn/o/1917431.html

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

相关文章

沃尔玛、亚马逊跨境电商测评补单自养号实操指南

通过自养号测评补单来提升流量是一种被众多卖家采用的运营手段&#xff0c;它可以帮助卖家快速提高商品的曝光度和吸引潜在买家。以下是自养号测评的详解&#xff1a; 一、自养号测评的定义 自养号测评是指卖家通过注册并管理自己的海外买家账号&#xff0c;对自家商品进行模…

linux 命令:Debian、ubuntu系统的离线软件包管理工具dkpg详解

目录 一、背景 二、工作原理 1、基本原理 2、与apt工具的对比 2.1优势 2.1.1直接为底层操作&#xff0c;可操控性好 2.1.2安装卸载和配置都可实现 2.2劣势 2.2.1依赖关系处理不足 2.2.2无法从软件仓库获取软件包 2.2.3用户界面不友好 2.3 总结 三、语法和使用 1、…

演唱会售票系统(Springboot+MySQL+Mybatis+BootStrap)

本演唱会售票系统结合了多个流行的技术栈&#xff0c;提供了全面的功能模块&#xff0c;包括用户和管理员两个角色。前端采用Bootstrap框架设计响应式界面&#xff0c;后端采用Spring Boot和MyBatis Plus实现业务逻辑和数据库操作&#xff0c;Sa-Token确保系统的安全性。通过这…

TikTok短视频矩阵管理系统源码

在数字化浪潮汹涌的今天&#xff0c;短视频已成为人们生活中不可或缺的一部分。TikTok作为短视频领域的佼佼者&#xff0c;其用户基数庞大&#xff0c;影响力深远。然而&#xff0c;对于众多内容创作者和营销人员来说&#xff0c;如何高效管理多个TikTok账号&#xff0c;实现批…

【AI大模型新型智算中心技术建设白皮书 2024】

文末有福利&#xff01; 一、新算效——重塑计算架构 1.1 下一代 AI 芯片设计思路 以 GPU 为 代 表 的 高 性 能 并 行 计 算 芯 片 架 构 和 以 针 对 AI 领 域 专 用 加 速&#xff08;DSA, Domain Specific Architecture&#xff0c;DSA&#xff09;为代表的芯片架构是目…

从头开始搭建一套Elasticsearch集群

前言 刚开始使用ES接触的就是rpm或者是云上提供的ES服务&#xff0c;基本上开箱即用。特别是云上的ES服务&#xff0c;开局就是集群版本&#xff0c;提供的是优化后的参数配置、开箱即匹配访问鉴权及常用插件&#xff0c;如无特殊需要基本上屏蔽了所有细节&#xff0c;直接可投…

视频压缩电脑软件,视频压缩电脑怎么操作

在数字媒体时代&#xff0c;视频文件的大小往往让人头疼。如何在不损失画质的情况下压缩视频&#xff0c;成为了许多创作者和普通用户的需求。本文将为你详细介绍电脑压缩软件&#xff0c;让你轻松应对视频压缩任务。 1.下载并安装视频压缩软件。 2.打开软件&#xff0c;选择视…

HTML集成优雅的实时输入清除功能

引言 你好呀&#xff0c;我是小邹。 点击访问 我的个人博客 在现代网页设计中&#xff0c;用户体验是至关重要的。一个流畅、直观且反应迅速的界面能够显著提升用户满意度。本文将介绍如何在网页表单中集成实时输入清除功能&#xff0c;即在输入框中显示一个“x”图标&#…

华为手机联系人不见了怎么恢复?3个解决方案

华为手机联系人列表就像是我们精心编织的社交网络之网。然而&#xff0c;有时&#xff0c;这张网可能会因为各种原因而意外破损&#xff0c;联系人信息消失得无影无踪&#xff0c;让我们陷入“人脉孤岛”的困境。华为手机联系人不见了怎么恢复&#xff1f;别担心&#xff0c;我…

3.js - 灯光与阴影 - 聚光灯

// ts-nocheckimport * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入hdr加载器 import { RGBELoader } from three/examples/jsm/loaders/RGBELoader.js // 导入lil.gui import { GUI } from thre…

关于 Qt在国产麒麟系统上设置的setFixedSize、setMinimumFixed、setMaxmumFixed设置无效 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140242881 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

万物皆可嵌入--embedding在GPU中的实现

摘要 Embedding技术自从谷歌推出word2vec的工作后得到迅速的应用&#xff0c;典型应用之一是在广告推荐场景中&#xff0c;从word2vec演进到item2vec&#xff0c;embedding技术的出现也使深度学习进入广告推荐的场景成为可能。广告推荐模型动辄几十GB甚至TB的模型大小&#xf…

MVC 控制器 中Action 不能同名,参数不一样,路由器寻找不到对应的,要加特性

//1 方法不可能完全相同&#xff0c;参数不同//2 那还需要特性吗&#xff1f;需要的&#xff0c;因为MVC选择方法时&#xff0c;不是按参数选择&#xff1a;http请求发送很多数据&#xff0c;其实没法识别&#xff0c;//因为mvc找方法是通过反射来的&#xff0c;GetMethods(nam…

C#(asp.net)房屋租赁管理系统-计算机毕业设计源码64421

目 录 摘要 1 绪论 1.1 研究背景与意义 1.2开发现状 1.3论文结构与章节安排 2 房屋租赁管理系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 …

vue3+springboot+mybatis+mysql项目实践--简单登录注册功能实现

这里是一次对vue3springbootmybatismysql的项目实现&#xff0c;简单实现前后端分离的登录注册功能&#xff0c;主要工具&#xff1a;idea,navicat 目录 一、创建vue3项目并初始配置 创建vue3项目 2.修改项目结构 1&#xff09;原始目录结构 2&#xff09;修改后目录结构 …

5G RedCap调查报告

一、5G RedCap技术背景 5G RedCap(Reduced Capability缩写,轻量化5G),是3GPP标准化组织定义下的5G裁剪版本,是5G面向中高速率连接场景的物联网技术,它的能力介于5G NR(含eMBB和uRLLC)和LPWA(如LTE-M和NR-IoT)之间,如图1所示,是5G-A(5G Advanced)的关键技术之一。…

用网络编程完成windows和linux跨平台之间的通信(服务器)

服务器代码逻辑&#xff1a; 服务器功能 创建 Socket&#xff1a; 服务器首先创建一个 Socket 对象&#xff0c;用于进行网络通信。通常使用 socket() 函数创建。 绑定&#xff08;Bind&#xff09;&#xff1a; 服务器将 Socket 绑定到一个特定的 IP 地址和端口号上。这是通过…

51单片机STC89C52RC——16.1 五线四相步进电机

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;步进电机 2.2 什么是步进电机&#xff1f; 2.2.1 步进电机驱动板 静态参数 动态参数 2.2.2 五线四相 单相激励步进 双相激励步进 混合激励驱动 2.3 细分驱动 2.4 通过数字信号控制旋转位置和转速。 2…

JavaScript-map方法

map可以遍历数组处理数据&#xff0c;并返回新的数组 语法&#xff1a; ​const arr[元素1&#xff0c;元素2&#xff0c;元素3] const newarrarr.map(function(数组的元素,数组的索引)){return 新元素 } const arr[blue,red,green]const newarrarr.map(function(ele,index){co…

物业系统自主研发接口测试框架

1、自主研发框架整体设计 1.1、什么是测试框架? 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架?框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架…