C/C++面经题-----malloc/free与new/delete区别

C/C++面试,面试官常常会询问我们malloc/free和new/delete的区别是什么?这个问题并不难,但是完全回答正确却不容易,下面我对其异同做出分点概述。

目录

malloc/new异同点

free/delete异同点


malloc/new异同点

<1>malloc 和 new 都是在堆上开辟的。但是 malloc 仅仅只是负责开辟内存,需要用户自己进行初始化;而 new 不但可以开辟内存,还可以自己进行初始化。

<2>malloc 是函数,开辟内存需要传入字节数回,返类型为void*,表示分配内存的起始地址,因此我们需要对其进行类型强转;而 new 是一个运算符,开辟内存需要指定类型,返回类型为指定类型的地址,故不需要进行类型强转。

int *p1 = (int*)malloc(sizeof(int));   //根据传入字节数开辟内存,没有初始化,类型强转为int*

int *p2 = new int(0);        //根据指定类型int开辟一个整形内存,初始化为0,无类型强转 

<3>malloc 开辟内存失败返回NULL,而 new 开辟内存失败抛出bad_alloc类型的异常,需要捕获异常才能判断内存开辟成功或失败,new运算符其实就是operator new运算符重载函数的调用,他底层调用也是通过 malloc() 来开辟内存的,只不过他比淡出的 malloc() 函数多了初始化的功能。

<4>malloc()函数开辟的内存永远是使用free()函数进行释放的;而new单个元素内存,用的是delete,如果new []数组,用的是delete []来释放内存的。

<5>malloc开辟内存只有一种方式,但是new有四种:a、普通的new;b、nothrow版本的new;c、const new;d、定位new

int *p1 = new int(0);     //内存开辟失败,抛出bad_alloc类型的异常

int *p2 = new(std::nothrow) int(0);   //内存开辟失败,返回NULL

int *p3 = new(ptr) string(0);      //在ptr指向的内存上开辟一个string类对象

free/delete异同点

<1>free 和 delete 都是释放堆上的内存。free仅仅是释放内存;而 delete 先析构对象,然后释放内存;

<2>free 是函数,而delete是运算符,delete其实就是operator delete运算符函数的调用,它底层也是通过 free() 来释放内存的。

<3>free用于释放malloc开辟的内存,而delete用于释放new开辟的内存;

<4>每一次调用free函数只用释放一个指针所指向的一块内存,但是delete可以同时释放多个指针指向的多个内存。

free(ptr)         //释放ptr指向的内存

delete []ptr;     //开辟数组元素是int*类型

以上内容均为个人理解,如有错误,欢迎大家评论指出,相互讨论,以便共同进步。

发布了40 篇原创文章 · 获赞 124 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/FDk_LCL/article/details/89600501
今日推荐