new/delete和malloc/free的区别

本文深入探讨了C++语言中内存管理的关键函数new与malloc的区别,包括安全性、功能特性及使用场景。重点强调了new在面向对象编程中的优势,以及如何在使用malloc时确保代码安全性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ref: hackbuteer1‘s blog

1、本质区别

malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。对于用户自定义的对象而言,由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不会自动调用构造函数和析构函数,从而无法满足动态管理对象的要求。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。

2. 安全性

int *p = new float[2]; //编译时出错
int *p = malloc(2*sizeof(float)); //编译不报错
1)new内置了sizeof、类型转换和类型安全检查功能,会自动计算需要分配的空间。new在创建动态对象的同时完成了初始化工作(自动调用了默认构造函数,也可以显示调用带参构造函数),但是如果new创建的是对象数组,那只能使用无参数构造函数。

int a = new Obj(para); //动态申请对象,并调用带参构造函数
int *a = new Obj[num]; //动态申请对象数组,只能调用无参数构造函数。

2)malloc需要手工计算字节数,malloc函数本省并不识别要申请的是什么类型,只关心内存的总字节数,因此需要显示的类型转换,用户需要对自己的行为负责(C相对于C++来说很不安全,from《C++编程思想》)。

3. 其他

1)new由两步构成:operator new+construct,同时,operator new可以重载,可以自定义内存分配策略(甚至不做内存分配,甚至分配到非内存设备上)。

2)在面向对象编程时,如果非要使用malloc/free,需要自定义一个initialization和destroy功能函数来完成对象的构造和析构。

3)两种申请内存的方式一定要配套使用:如果用free释放new创建的动态对象,那么该对象因无法执行析构函数而可能导致程序出错;如果用delete释放malloc申请的动态内存,理论上讲程序不会出错,但是该程序的可读性很差。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值