new/delete和malloc/free的区别

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申请的动态内存,理论上讲程序不会出错,但是该程序的可读性很差。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值