malloc/free与new/delete的区别

企业微信群机器人配置全攻略:从零到消息推送的完整流程 本文详细介绍了企业微信群机器人的配置与使用全流程,从零开始指导如何创建机器人、获取Webhook地址,到通过HTTP请求发送文本、Markdown、图片及模板卡片等多种消息类型。内容涵盖核心的接口配置、安全实践及实战应用场景,帮助开发与运维团队快速构建自动化消息推送中枢,提升协作效率。 阅读详情

 

相同点:都可用于申请动态内存和释放内存

不同点:
(1)操作对象有所不同。
malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。

(2)用法上也有所不同。
函数malloc 的原型如下:
void * malloc(size_t size);
用malloc 申请一块长度为length 的整数类型的内存,程序如下:
int *p = (int *) malloc(sizeof(int) * length);
我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。
1、malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。
2、 malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。
函数free 的原型如下:
void free( void * memblock );
为什么free 函数不象malloc 函数那样复杂呢?这是因为指针p 的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p 是NULL 指针,那么free
对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。


new/delete 的使用要点:
运算符new 使用起来要比函数malloc 简单得多,例如:
int *p1 = (int *)malloc(sizeof(int) * length);
int *p2 = new int[length];
这是因为new 内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new 的语句也可以有多种形式。
如果用new 创建对象数组,那么只能使用对象的无参数构造函数。例如
Obj *objects = new Obj[100];       // 创建100 个动态对象
不能写成
Obj *objects = new Obj[100](1);        // 创建100 个动态对象的同时赋初值1
在用delete 释放对象数组时,留意不要丢了符号‘[]’。例如
delete []objects; // 正确的用法
delete objects; // 错误的用法
后者相当于delete objects[0],漏掉了另外99 个对象。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        1、new自动计算需要分配的空间,而malloc需要手工计算字节数
        2、new是类型安全的,而malloc不是,比如:
                 int* p = new float[2]; // 编译时指出错误
                 int* p = malloc(2*sizeof(float)); // 编译时无法指出错误
          new operator 由两步构成,分别是 operator new 和 construct
        3、operator new对应于malloc,但operator new可以重载,可以自定义内存分配策略,甚至不做内存分配,甚至分配到非内存设备上。而malloc无能为力
        4、new将调用constructor,而malloc不能;delete将调用destructor,而free不能。
        5、malloc/free要库文件支持,new/delete则不要。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

1、本质区别
malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。
对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。

class Obj
{
public:
	Obj( ) 
	{ cout  <<  "Initialization"  <<  endl; }
	~ Obj( )
	{ cout  <<  "Destroy" <<  endl; }
	void Initialize( )
	{ cout  <<  "Initialization"  <<  endl; }
	void  Destroy( )
	{ cout  <<  "Destroy"  <<  endl; }
}obj;

void  UseMallocFree( )
{
	Obj   * a  =  (Obj  *) malloc( sizeof ( obj ) );      //  allocate memory 
	a -> Initialize();                                    //  initialization
	// … 
	a -> Destroy();                                        // deconstruction 
	free(a);                                               // release memory
}

void  UseNewDelete( void )
{
	Obj   * a  =   new  Obj;                                           
	// … 
	delete a; 
}


 

类Obj的函数Initialize实现了构造函数的功能,函数Destroy实现了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成“构造”与“析构”。所以我们不要用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。

2、联系
既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete、malloc/free必须配对使用。

 

Java对接快递鸟,查询快递物流信息 根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递API接口,实现自动查询的功能。下面是java版本的根据单号查询物流跟踪信息的详细示例代码。只需要下载就可以运行,(自己需要简单的修改)注:登录快递鸟用户管理后台后获得。登录快递鸟用户管理后台。 阅读详情

相关推荐

STM32L431电池供电项目实战:用STOP2模式把功耗降到5uA以下(CubeMX配置详解)

本文详细介绍了如何在STM32L431电池供电项目中利用STOP2模式实现5μA以下的超低功耗设计。通过CubeMX配置、硬件优化和软件策略,成功将农业温湿度监测节点的待机功耗控制在4.7μA,确保CR2032电池供电下3年以上的工作寿命。文章包含完整的低功耗实现路径和实测数据,特别适合物联网边缘设备开发者参考。

weixin_30345577的博客 393

内存管理---malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并而需要手动释放,申请连续的空间一般是2个G,不同点是: 1.malloc和free是函数,new和delete是操作符 2.malloc申请的空间不会初始化,new可以初始化 3.malloc申请空间时,需要手动计算空间大小并传递,new只需要在其后跟空间的类型.如果是多个对象,[]中指定对象个数即可. 4.malloc返回值类型为void* ,在使用时必须强转,new不需要,因为new后面跟的是空间的类型 5.mall

m0_51364183的博客 4347

41-dify案例分享-基于database插件实现Text2sql的数据库查询图表工作流

本文介绍基于 Text2SQL 的 Dify 工作流实现过程。先阐述 Text2SQL 概念、步骤及应用领域。接着说明工作流制作,包括用 chatflow 加开场白、获取系统时间,配置 LLM 生成 SQL,用 SQL Execute 工具查询,经 LLM 汇总结果,代码生成 ECharts 数据,条件分支判断图表类型输出。最后介绍验证测试、提供体验地址,还提及借助工具生成建表和初始化数据 SQL 语句。

个人技术 1万+

free和delete区别

free和mall匹配:释放malloc出来动态内存; delete和new匹配:释放new出来的动态内存空间。 1, malloc/free是c/c++标准库的函数,new/delete除了分配空间还会调用构造函数和析构函数进行初始化和清理(清理成员)。 2, malloc/free需要手动计算类型大小且返回值是void*,new/delete可以自己计算类型大小,返回对应的指针。

prerfect_cat的博客 8617

MS51内部振荡器

MS51内部有两个RC振荡器,一个高速16MHz或24MHz(HIRC),可通过HIRC24(RCTRIM1.4)位进 行选择配置,以及一个低速10 kHz(LIRC)。它们都可被选择用作系统时钟。通过设置HIRCEN (CKEN.5)位使能HIRC,设备上电时LIRC被使能。用户可设置OSC[1:0] (CKSWT [2:1])为[0,0]选择HIRC 作为系统时钟,设置OSC[1:0](CKSWT [1:0])为[1,0]选择LIRC作为系统时钟。注意:MS51上电后HIRC 和 LIRC都被...

seraphseraphhill2008的博客 808

Python实战:动态爬取国家地表水水质实时监测数据(附最新代码解析)

本文详细介绍了使用Python动态爬取国家地表水水质实时监测数据的实战方法。针对动态网站数据加载特点,重点解析了如何利用Selenium模拟浏览器操作、结合BeautifulSoup解析数据,并提供了最新的代码实现与常见问题解决方案,帮助开发者高效获取环境监测数据。

app77的博客 272

new、delete与malloc、free的区别,内在实现。

new、delete与malloc、free的区别;以及new与new[],delete,delete[]的区别。

JACKSONMHLK的博客 1801

ARM CMSIS DAP源码分析(二)

今天分析的是RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)和RDDI_DAP_SetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)这两个函数。 以RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)为例,代码如下:

pengxiao618的专栏 7977

molloc/free和new/delete的区别

malloc/free和new/delete的区别 malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。 不同的地方是: malloc和free是函数,new和delete是操作符 malloc申请的空间不会初始化,new可以初始化 malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可 malloc的返回...

一条二哈 1247

解决anaconda占用C盘空间过多问题

anaconda就算安装在其他盘,默认会把索引、锁定文件、压缩包等都放到系统盘(C盘),我用了两年,占用30GB。 1. 卸载不用的虚拟环境 查看已安装的虚拟环境 conda env list 卸载不用的、过期的虚拟环境 conda remove -n (要卸载的环境的名字) --all 2. 删除索引缓存、锁定文件、未使用过的包和tar包 conda clean -a 清理完之后,删除了15GB,还剩15GB,舒服了 ...

沉迷单车的追风少年 3万+

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

new/delete与malloc/free的区别

new做两件事,一是分配内存,二是调用类的构造函数;new建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,用指针访问,可以在里面移动指针。malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常。new、delete是C++中的操作符,malloc和free是标准库函数。,并且可以自动计算所申请内存的大小。new建立的是一个对象,而malloc分配的是一块内存。new申请的空间会初始化,而malloc不会初始化。

Mr_Guan的博客 443

微信小程序 - 解决video视频播放黑屏只有声音没有画面问题,使用Video标签无法播放视频失败只有声音、黑屏视频播放不了,安卓手机/苹果ios视频只有声音却没有画面(uniapp微信小程序也适用)

微信小程序video有声音但是画面黑屏,uni-app微信小程序视频播放黑屏但是有音频,微信小程序video android真机或苹果ios系统中黑屏 只有声音没有画面,Uniapp微信小程序 Video MP4视频播放失败,只有声音,黑屏,视频播放不了,解决办法,解决小程序视频编码兼容性问题导致黑屏,出现黑屏但有声音的问题,video标签播放视频有声音,但是黑屏的原因及解决办法,mp4视频编码的问题,video标签播放视频有声音,但是黑屏。uniapp使用video标签无法播放视频出现黑屏问题处理,如何解

🏆 前端领域优质创作者 7777

new/delete和malloc/free的区别联系

1.先来谈谈new和delete 在C++中堆内存的分配和释放是通过new和delete来操作的,它们和C语言的malloc和free有什么区别呢? (1)new的底层也是通过malloc来开辟内存的 new比malloc多一项功能,就是开辟完内存,还可以进行初始化操作 如下: int *p = new int(10); 上面是new的基本操作,10代表堆上开辟的整形内存的初始值;如果是自定义类类型的话,如下: Test *p = new Test(); // Tset是一个实现定义好的类 这个语句不

qq_37535749的博客 1389

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

new/delete与malloc/free之间的联系和区别

new/delete与malloc/free之间的联系和区别 (1) malloc/free和new/delete的联系      a)存储方式相同。malloc和new动态申请的内存都位于堆中。申请的内存都不能自动被操作系统收回,都需要配套的free和delete来释放。      b)除了带有构造函数和析构函数的类等数据类型以外,对于一般数据类型,如int、char等等,两组动态申请的方

我的读书笔记(2011-2013) 1079

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++ 中 new/delete 与 malloc/free的区别

(1) new/delete是运算符,只能在C++中使用,它可以重载; mallloc/free是C的标准库函数,在C/C++中都可以使用。 (2)对于非内部的数据类型的对象而言,光用malloc/free是无法满足动态对象的要求的。对象在创建的时候需要执行构造函数,对象在消亡之前需要执行析构函数。而molloc/free是库函数而不是运算符,不在编译器的控制范围之内,...

TechArtisan6的博客 1068

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

new/delete , new/delete[] , malloc/free区别

原文地址 本文是上面那篇总结了,再加上了一点点自己的体会 (i)malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员); (ii)malloc/free是C/C++标准库的函数,new/delete是C++操作符; (iii)new表达式并不直接开辟内存出来,而是通过调用operator new来获得的内存,而...

weixin_43482279的博客 184

malloc/free和new/delete的区别

内容会持续更新,有错误的地方欢迎指正,谢谢! 异同 相同点: 都可用于申请动态内存并释放内存。 不同点: 1.本质不同 malloc与free是C++/C 语言的标准库函数,而new/delete 是C++的运算符。 对于非内部数据类型(内部数据类型:不需要用户自己定义,如int,char,float等;非内部数据类型:需要用户自己定义,如struct,enum,unio...

陈云佳的专栏 540

new/delete和malloc/free的区别(malloc代码实现待完善)

目录 1)new和delete的用法 2)new int和new int()的区别 3)malloc和free的用法 4)new和malloc的区别 5)代码实现malloc 相同点:都可用于申请动态内存和释放内存 1)new和delete的用法 int *pi=new int; int *pi=new int(); int *pi=new int(1024);  第一行这个...

beibaoke910的专栏 239

new/delete 和 malloc/free 区别

在 C++中堆内存的分配和释放是通过 new 和 delete 来操作的。使用方式如下开辟内存: 类型* 指针变量名 = new 类型(初始化数值);释放内存: delete 指针变量名;1.malloc开辟空间是函数,需要引用<stdlib.h>头文件new是关键字2.malloc开辟空间返回无类型指针,需要强转new 是int类型的空间3.malloc 要计算类型的大小new int类型的大小是自动进行计算的4.malloc只是开辟空间。

ljy的博客 481

C++中malloc/free与new/delete区别

本博文源于《C++基础》,今天学习C++基础的时候,突然发现我在对这两个概念搞得不是很临清,故我将其转换为博文。旨在分辨malloc/free与new.delete的区别。

执念斩长河 687

malloc/free 与 new/delete 的区别

在进行C/C++编程开发时,经常会遇到malloc/free 与 new/delete 这两对操作,主要功能就是可以在程序运行过程中动态的申请、释放内存,从而达到对内存的操作。但是这两对操作是有区别的,不能交叉搭配使用:即不能 free掉new来的内存,也不能delete掉malloc来的内存空间。虽然有时候可以delete掉malloc来的内存,或者free掉new来 的内存,但是通常情况下会给

caojunling的专栏 707

new/malloc和delete/free的区别

new/malloc和delete/free都可用于申请动态内存和释放内存 ~~ 一、new/malloc和delete/free的区别? 1、malloc与free是C++/C 语言的标准库函数,malloc/free需要库文件支持,而new/delete 是C++的运算符,不需要库文件支持 2、C++中new/delete能调用构造函数和析构函数,而malloc/

qq_36953135的博客 656
上一篇: C++里的静态(static)成员函数(不能用const的原因+static在c++中的第五种含义)
下一篇: 揭露谭浩强的错误-证实不能用字符指针变量做形参
seadplus
博客等级 码龄15年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值