理解new 与delete
一 :new 与 malloc 的区别
- malloc 是按字节开辟的,new是按类型开辟内存的
- malloc 返回的void* , 而new 会返回指定类型的地址
- malloc 只负责开辟内存,new 不但开辟内存,还可以初始化。
- malloc 开辟内存失败返回NULL, 而new 会抛出异常
- malloc 是库函数 , 而new 是运算符
二 :delete 与 free 的区别
- free 直接释放内存 ,delete会调用对象的析构函数,在释放内存
- 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 会导致内存泄露,