malloc,free与new/delete的区别

面试题1:c库中有malloc/free来动态管理内存,c++中为什么还要new/delete操作符来管理内存?

       对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

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

面试题2:malloc/free与new/delete的区别和联系

联系:都是动态管理内存的入口

区别:

  • malloc/free是c/c++语言提供的函数,new/delete是c++提供的操作符
  • malloc的参数是字节,new的参数是类型,所以malloc需要手动计算类型大小,而new是编译器会根据类型自行计算
  • malloc/free会调用构造和析构函数,而new/delete会调用构造和析构函数
  • malloc的返回值是void*,需要强转,而new申请成功时返回的是对象类型的指针,与对象类型严格匹配,不需强转
  • 因为malloc返回值是空,所以需要判空,而new申请空间时,有应用措施,如果申请失败,会抛出bac_alloc异常异常,所以不需要判空
  • malloc不能初始化,而new可以初始化
  • malloc申请的空间一定在堆上,而new是在自由存储区上为对象动态分配内存,凡是通过new申请的内存空间都称之为自由存储区自由存储区可以是堆,也可以是静态存储区,这取决于operator  new在哪里为对象分配内存
  • c++允许重载new/delete操作符,而malloc不允许重载

总结:

malloc/free,new/delete,new[]和delete[]使用不当所引起的内存泄漏问题:

最重要的是上述三组一定要匹配使用,那我们来分析一下如果不匹配使用会造成什么样的后果:

对于内置类型(int,char等),如果不匹配使用,也不会造成任何问题

对于自定义类型,并且析构函数显示的给出,如果不匹配使用,那么一定会造成内存泄漏或者程序崩溃;如果没有显示的给出,那么不匹配使用的后果可能会造成内存泄漏

由此得出,程序崩溃的现象主要取决于析构函数

猜你喜欢

转载自blog.csdn.net/Freedom_222/article/details/82026619