malloc/free 和 new/delete相关的面试题

1):C++有了malloc/free 为什么还要new/delete?

(1)malloc/free只在申请空间时,它们只需要申请空间,无法对空间进行操作。

(2)而在创建C++的对象时,不仅仅是需要申请空间,还需要自动调用构造函数,以及在对象消亡之前要自动执行析构函数。

因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。

根据上面两点,我们可以知道malloc/free 是不能满足C++的需要的,因此需要new/delete。

即在创建对象时,能分配内存空间且初始化内存 + 销毁对象时,能回收空间且对内存进行清理的new/delete。

2)为什么malloc/free在申请空间时,它们只能申请空间,无法对空间进行操作?

因为:malloc/free是库函数,使用它需要头文件,在一定程度上是独立于语言的。编译器在处理库函数时,编译器不需要知道它是做啥的,而仅仅需要对该函数进行编译,并且保证调用函数时的参数和返回值是合法的,,并生成相应 call 函数的代码就ok了。编译器不会控制库函数做一些操作,比如调用构造函数和析构函数。因此malloc/free无法满足动态生成对象的要求。

3)为什么new/delete在申请空间时,它们不仅能申请空间,还能调用构造函数或析构函数对对空间进行操作?

因为:new/delete是运算符,它与+-*/的地位 是一样的。编译器看到new/delete时,就知道只要它要做啥操作,并生成对应的代码。

4):malloc/free 和 new/delete 的相同点和不同点

相同点:它们都可以申请和释放空间。

不同点:

一、new/delete 在申请空间的时候能对空间进行操作,而malloc/free 不能。

(1)new :分配内存 + 调用类的构造函数 + 初始化 delete:释放内存 + 调用类的析构函数

(2)malloc:只分配内存,不会进行初始化类成员的工作 free只释放内存,不会调用析构函数

二、new/delete是C++运算符,能重载

(1)new、delete 是运算符,可以进行重载

(2)malloc,free是标准库函数,不可以进行重载,但可以覆盖。

三、new delete 更加安全,简单:

(1)不用计算类型大小:自动计算要分配存储区的字节数

(2)不用强制类型转换:自动返回正确的指针类型(二者返回值不同,一个为void*,一个是某种数据类型指针)

四、new可以分配一个对象或对象数组的存储空间,malloc不可以

五、new和delete搭配使用,malloc和free搭配使用:混搭可能出现不可预料的错误

六、new后执行的三个操作:(某面试题目)

(1)new的类分配内存空间。

(2)调用类的构造方法。

(3)返回该实例(对象)的内存地址

当你能爱的时候就不要放弃爱

malloc/free 和 new/delete相关的面试题

相关文章:

你感兴趣的文章:

标签云: