网易首页 > 网易号 > 正文 申请入驻

new和malloc的区别

0
分享至

这个问题堪称经典。如果你是面试官,我建议你把这个问题作为你面试求职者的必选题目之一。如果你是求职者,我会建议你读懂和熟透这个题目涉及到的知识点。这个问题涉及到了C和C++中最经典的部分,可能也是C和C++的交汇。

一些刚毕业的学生如果没有经验可能很难深有体会,大都数是强背。而工作多年的人深有体会是因为一个入门了,一个是吃过亏了,然后对编程和语言本身都有很大的升华。如果工作多年还不能回答此问题的,我觉得不算是很好的程序员。我认为可以从内存区域,重载,自定义类型,分配成功,返回类型,参数,属性等方面来聊一聊。

内存区域

如果能从内存回答的话,基本可以判定这个人是优秀的。很多人都会觉得new和malloc都在堆上,事实上不太准确的。

new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。

而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中。

重载

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

而malloc不允许重载,这条要记得,malloc不能重载。new重载,可以有多个构造函数。

自定义类型

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

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

分配失败

new内存分配失败时,会抛出bac_alloc异常。优秀的程序员会在使用的时候去判断内存分配是否成功,很多人new完是不作判断的,所以我的看法是你如果非常有自信,不然还是要一定的判断语句或者日志log便于追踪后续。

malloc分配内存失败时返回NULL。

返回类型

new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符,这里特别提到类的构造函数,构造函数是没有返回类型的,是不能返回的。

而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

参数

使用new操作符申请内存分配时无须指定内存块的大小,最常见的就是类的实例化。只要new然后传参即可。编译器会根据类型信息自行计算。

而malloc则需要显式地指出所需内存的尺寸,malloc很多新手都是给的内存尺寸不够多。记得以前有个C项目代码,有个新手不断用数组造成栈溢出,而另外一个个人不断用malloc分配内存也造成常见的crash。

属性

new对应delete,是C++关键字,需要编译器支持。malloc对应free是库函数,需要头文件支持。在编程代码中,一定要记得关键字对应匹配,不能分配内存不释放或者分配不成功就去释放。

我面试过深信服,字节跳动,迅雷等互联网公司,无一例外的考了这道题目。很多时候面试官都是当成一道基础题目来考你,但凡你能够用内存上或者平日里的一些心得来回答,我觉得都会让你脱颖而出。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
中共中央决定:3省区党委主要负责同志职务调整!还有11位省部级干部密集履新

中共中央决定:3省区党委主要负责同志职务调整!还有11位省部级干部密集履新

鲁中晨报
2024-07-01 17:47:04
太痛心!17岁国羽新星命丧印尼,罪魁祸首浮出水面,林丹早有预料

太痛心!17岁国羽新星命丧印尼,罪魁祸首浮出水面,林丹早有预料

球盲百小易
2024-07-02 01:33:43
腾讯宣布打击极端民族主义内容后,有网友宣布自己抵制微信支付

腾讯宣布打击极端民族主义内容后,有网友宣布自己抵制微信支付

映射生活的身影
2024-07-01 13:12:02
张志杰姨夫:志杰幼年丧父母亲一手带大,妈妈听到噩耗后病倒入院

张志杰姨夫:志杰幼年丧父母亲一手带大,妈妈听到噩耗后病倒入院

直播吧
2024-07-01 21:09:49
印尼宣布对中国商品征收200%关税后,有网友宣布以后不买印尼产品

印尼宣布对中国商品征收200%关税后,有网友宣布以后不买印尼产品

映射生活的身影
2024-07-01 12:14:31
重磅!离开勇士!Woj:克莱先签后换!3年5000万加盟独行侠

重磅!离开勇士!Woj:克莱先签后换!3年5000万加盟独行侠

直播吧
2024-07-02 02:40:10
17岁国羽小将赛场猝死细节曝光,现场处置令人愤怒!姐姐发声质疑

17岁国羽小将赛场猝死细节曝光,现场处置令人愤怒!姐姐发声质疑

鲁中晨报
2024-07-01 14:59:16
国家队给各地收储下了死命令…

国家队给各地收储下了死命令…

大碗楼市
2024-07-01 08:03:05
深中通道开通引发国际热议 , 挪威网友质疑 : 这么穷的国家怎做到的?

深中通道开通引发国际热议 , 挪威网友质疑 : 这么穷的国家怎做到的?

辉哥说动漫
2024-07-01 22:07:43
车臣督战队哗变,乌军歼灭俄罗斯女囚突击队,首次俘获女囚

车臣督战队哗变,乌军歼灭俄罗斯女囚突击队,首次俘获女囚

史政先锋
2024-07-01 22:19:50
苦一苦百姓之后,有些地方又开始苦一苦孩子

苦一苦百姓之后,有些地方又开始苦一苦孩子

观风者
2024-07-01 17:45:16
云南省通报2起整治形式主义为基层减负典型问题

云南省通报2起整治形式主义为基层减负典型问题

新京报
2024-07-01 18:40:07
债牛疯狂不止,引央行“出手”!将开展国债借入操作

债牛疯狂不止,引央行“出手”!将开展国债借入操作

财联社
2024-07-01 16:05:13
3年5000万!汤普森加盟独行侠!拒绝湖人4年合同,詹姆斯成了笑话

3年5000万!汤普森加盟独行侠!拒绝湖人4年合同,詹姆斯成了笑话

篮球教学论坛
2024-07-02 05:54:20
C罗流下英雄泪!加时打飞绝杀点球!当场抱头捂脸大哭,队友安慰

C罗流下英雄泪!加时打飞绝杀点球!当场抱头捂脸大哭,队友安慰

嘴炮体坛
2024-07-02 05:30:55
伊朗搞了个世界大新闻!内贾德重夺政坛,哈梅内伊能否阻挡?

伊朗搞了个世界大新闻!内贾德重夺政坛,哈梅内伊能否阻挡?

小小包工头阿汾
2024-07-02 01:36:43
果不其然!美大选一夜天翻地覆,下任总统毫无悬念?奥巴马担忧了

果不其然!美大选一夜天翻地覆,下任总统毫无悬念?奥巴马担忧了

花小猫的美食日常
2024-07-02 02:39:28
83岁老妈移民美国,回国住28天,她说,美国对老人的好超乎想象

83岁老妈移民美国,回国住28天,她说,美国对老人的好超乎想象

爱情大使馆
2024-06-30 15:50:30
16岁中国留学生在新西兰遇袭!公交上被铁棍打掉5颗牙,仅75岁老华人出手相助

16岁中国留学生在新西兰遇袭!公交上被铁棍打掉5颗牙,仅75岁老华人出手相助

不掉线电波
2024-07-01 16:15:53
农村学生营养餐补被挪用偿还政府债务,涉及66县、近20亿元

农村学生营养餐补被挪用偿还政府债务,涉及66县、近20亿元

界面新闻
2024-07-01 12:28:15
2024-07-02 06:46:44
新能源自动驾驶
新能源自动驾驶
专注于半导体行业资讯
874文章数 336关注度
往期回顾 全部

科技要闻

天兵科技巩义现场工作人员:正寻找黑匣子

头条要闻

欧洲杯-葡萄牙点球3-0斯洛文尼亚 进8强战法国

头条要闻

欧洲杯-葡萄牙点球3-0斯洛文尼亚 进8强战法国

体育要闻

葡萄牙的神!他拯救C罗拯救葡萄牙

娱乐要闻

今年内娱最大的闹剧,该收场了

财经要闻

债牛疯狂不止,引央行“出手”!

汽车要闻

奥迪Q6 e-tron Sportback官图曝光

态度原创

时尚
房产
旅游
家居
公开课

这双鞋太火了!怎么搭都好看|好物

房产要闻

官宣去库存!海南这一区域商办产品,已无限接近住宅!

旅游要闻

一大巴翻覆致两名中国游客身亡 马来西亚将对涉事旅行社启动调查程序

家居要闻

美式风格 呈现田园风格

公开课

连中三元是哪三元?

无障碍浏览 进入关怀版