【C++语法】new和malloc的区别

属性

new和delete是C++中独有的操作符,需要编译器支持;而malloc和free是C/C++中的标准库函数,需要头文件支持。

参数

使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。
而malloc则需要显式地指出所需内存的尺寸。

返回类型

new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。
而malloc内存分配成功则是返回void * (可强制转换为任何类型),需要通过强制类型转换将void*指针转换成我们需要的类型。

分配失败

new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。

自定义类型

new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)?。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。

malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。

重载

C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载。

内存区域

new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中

基本单位

new以具体类型为单位进行内存分配 malloc以字节为单位进行内存分配

new与malloc比较与底层实现

1.new与 operator new() 关系,placement new 作用

new指C++里通常用运算符,不可重载,比如A* a = new A; (1)调用:operator new()分配内存,(2)执行构造函数,返回指向分配内存的指针
operator new():指对new的重载形式,它是一个函数,并不是运算符。对于operator new来说,分为全局重载和类重载,全局重载是void* ::operator new(size_t size),在类中重载形式 void* A::operator new(size_t size),重载后形参可能发生变化的。
A* a = new A 的调用过程为:(1)分配内存:调用operator new()分配内存,如果是类重载则是调用如果类A重载了operator new,那么将调用A::operator new(size_t ),如果没有重载,就调用全局::operator new(size_t ),事实上都是调用系统默认的全局::operator new(size_t size),调用malloc分配内存,并且返回一个void*指针。此外,类重载可以只是指定了内存分配失败的调用的new_handler处理函数,改写为global_new_handler,类对象析构后之后global_new_handler复位,分配失败抛出异常。(2)构造函数:执行构造函数,返回指向分配内存的指针,这一步在new中完成。
placement new: 如果new在执行operator new()成功,但是在执行构造时候失败,这是需要释放内存,否则会内存泄漏,但是没有返回指针,客户无法释放,需要由系统自动释放。正常的operator new(size_t size)对应operator delete(void *pmemory),如果是带有额外附加参数的operator new(size_t ,void *pmemory),则无法用全局operator delete释放,形成了placement new() 函数,因此必须也为其定义带有额外参数、用于释放的placement delete()函数, operator delete(void *pmemory,void ptr)正确释放。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值