【背景介绍】
前段时间参加腾讯面试,面试官让我说说malloc与new的区别;当时一下懵逼了,当时想到的只有new是C++的,在申请内存的时候应该会调用new的构造函数进行申请内存与初始化;以及new对应的是释放是delete。malloc对应的是C语言中的内存申请函数,其他更多的就不知道了。查询资料发现new和malloc的差别比较多,根据在网上查询到的资料进行总结。主要参考博客:https://www.linuxidc.com/Linux/2016-01/127591.htm
【正文】
1、new是操作符,malloc为库函数。
2、存储位置差异:
2.1 new操作符从自由存储区上为对象动态分配内存空间,自由存储区分配的内存可以是堆上也可以是静态存储区域;通过delete释放分配的空间。
2.2 malloc为库函数,分配的内存在操作系统的堆上;必须通过free函数进行释放。
3、返回类型差异性:
3.1 new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换;如果内存分配失败,抛出bac_alloc异常,它不会返回NULL。所以在堆new申请的内存进行判断时,不能判断new返回的结果是否为NULL。
3.2 malloc函数分配成功时,返回值为void *,需要根据需要进行类型转换;如果内存分配失败,返回NULL。
4、是否需要指定分配内存大小
4.1 new会根据类型信息进行自行计算,从而在分配内存时不需要指定大小
4.2 malloc函数在进行内存分配时,需要指定分配内存的大小;
5、是否需要调用构造函数
5.1 new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构;
其中,new操作符分配内存主要分为以下三步骤:
第一步:调用operator new函数分配足够的空间;
第二步:通过编译器调用对应的构造函数来进行初始化;
第三步:返回指向该对象的指针。
并在使用delete操作符释放对象时,首先调用对象的析构函数,再调用operator delete函数释放空间。
5.2 malloc/free不会调用构造函数/析构函数
6、是否可以直观分配内存
6.1 使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并且返回原来的地址指针;如果空间不够,先按照新指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来的内存区域。
6.2 new没有这样直观的配套设施来扩充内存。
7、new操作符具有操作符重载等特性,而malloc不具有该特性。