理解new 与delete

 

一 :new 与 malloc 的区别 

  1.       malloc 是按字节开辟的,new是按类型开辟内存的  
  2.       malloc 返回的void*  , 而new 会返回指定类型的地址
  3.       malloc 只负责开辟内存,new 不但开辟内存,还可以初始化。
  4.       malloc 开辟内存失败返回NULL, 而new 会抛出异常
  5.       malloc 是库函数 , 而new 是运算符

二 :delete 与 free 的区别

  1. free 直接释放内存 ,delete会调用对象的析构函数,在释放内存
  2. free是库函数,delete是运算符

new 操作的过程    :

  • 调用operator new 开辟内存(调用malloc),在调用构造函数,构造对象

delete 操作过程    :

  • 调用对象的析构函数,在调用operator delete(调用free)释放内存

对于new 开辟数组,会调用对应的operator new[]  释放调用 operator delet[]   

 

一个问题 new 与 delete 能混用吗? c++ 为什么区分单个数据,和多个数据的开辟和释放?

  •  对于普通的内置类型,不会涉及构造析构,new / delete[]  与 new[] / delete 可以混用
  • 对于自定义的类类型,不能混用,因为开辟数组时,会在多开辟4 字节,并且前4 字节放存储了多少对象,返回给用户的是偏移4字节的因此直接调用delete 会导致内存泄露,
posted @ 2020-09-01 09:36  睡觉lc  阅读(186)  评论(0编辑  收藏  举报