C++ new 与C malloc的区别

本文深入探讨了C++中new和malloc在内存分配上的关键不同,包括构造函数调用、失败返回值、参数需求、返回类型及自定义类型处理等方面,揭示了两者在内存管理上的本质差异。

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

今天问同学的面试情况,他说出了这个问题,但是当时只能答出:free有三步,计算所需要分配的内存空间大小,调用构造函数,返回内存的地址;malloc 只有两步,分配内存,返回内存地址。所以最大的区别就是new会调用构造函数,malloc不调用构造函数。。。这个答案面试官应该不会满意吧。。。

追本溯源

转载自这篇文章,总结得非常到位,方便自己再看。。。
最大区别: new在申请空间的时候会调用构造函数,malloc不会调用。
属性上: new/delete是C++关键字需要编译器支持,maollc是库函数,需要添加头文件。
申请失败返回: new在申请空间失败后返回的是错误码bad_alloc,malloc在申请空间失败后会返回NULL。
参数: new在申请内存分配时不需要指定内存块大小,编译器会更具类型计算出大小,malloc需要显示的指定所需内存的大小
成功返回类型: new操作符申请内存成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,因此new是类型安全性操作符。malloc申请内存成功则返回void*,需要强制类型转换为我们所需的类型
自定义类型: new会先调operator new函数,申请足够的内存(底层也是malloc实现),然后调用类的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数来释放内存(底层是通过free实现)。malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构函数
重载: C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回地址。malloc不允许重载。
从上面可以知道,delete和free的区别,也知道一二了。那么delete和free的共同点呢?
它们都是只把指针所指向的内存释放掉了,指针变量本身还是存在的,只是都指向NULL。在free和delete之后,都需要把指向清理内存的指针置为空(程序员主动置为NULL),否则指针指向的内存空间虽然释放了,但是指针p的值还是记录的那块地址**,该地址对应的内存是垃圾,p就成了“野指针”**。
注意!!!野指针不是NULL指针!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值