malloc free和new delete有什么区别问答?

面试官: 请说一下,malloc/free和new/delete有什么区别?

在C和C++编程中,malloc/free和new/delete虽然都可以用来申请和释放内存,但是它们的原理以及使用上都存在着很多的不同。

具体来看,它们主要有5个不同点:

1、属性不同

malloc/free是glibc库提供的库函数,使用时需要引入相应的头文件。

new/delete不是函数,而是C++中的关键字,使用时不需要依赖头文件,但是需要编译器支持。

2、使用上的区别

malloc申请内存空间时需要显式填入申请内存的大小。malloc内存分配成功时返回void * ,需要通过强制类型转换,将void*指针转换成我们需要的类型。malloc分配内存失败时返回NULL,我们可以通过返回值判断内存是否分配成功。

new会根据new的类型来分配内存,所以无需显式填入申请的内存大小。new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,所以new是符合类型安全性的操作符,在C++程序中使用new会比malloc安全可靠。new内存分配失败时,不会返回NULL,而是抛出异常,如果不捕捉异常,那么程序就会异常退出。

3、内存位置的区别

malloc申请的内存是在堆空间。堆是操作系统分配给进程的一块特殊内存区域,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,调用free()归还内存。

new分配的内存空间是在自由存储区。自由存储区是C++中动态分配和释放对象的一个概念,通过new分配的内存区域可以称为自由存储区,通过delete释放归还内存。自由存储区可以是堆,也可以是全局静态存储区,具体是在哪个区,要看new的实现以及C++编译器默认new申请的内存是在哪里。很多C++编译器默认使用堆来实现自由存储,new和delete内部默认使用malloc和free的方式来被实现。

4、是否可以重载

在C++中new和delete符号是可以重载的,所以可以重新实现new的实现代码,让其分配的内存位置在静态存储区等。而malloc和free是C里的库函数,无法对其进行重载。

5、是否可以动态扩充内存

使用malloc分配内存后,如果发现内存不够用,可以通过realloc函数来扩充内存大小。

而new没有扩充内存的机制。

软件开发面试问答 文章被收录于专栏

分享软件开发岗位面试题及答案

全部评论

相关推荐

投递腾讯等公司10个岗位
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务