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)返回该实例(对象)的内存地址