new、delete、[]new、[]delete

参考B站侯捷

new的分解动作

  1. new关键字调用operator new
  2. operator new调用malloc
  3. 强制转换
  4. 调用构造函数(这也是为什么malloc不能申请包含指针的类内存的原因)
  5. PS:new关键字是表达式,固定形式;operator new才可以重载

delete的分解动作

  1. delete关键字
  2. 调用析构函数
  3. delete关键字调用operator delete
  4. operator delete调用free

malloc分配的内存并不只是你申请的大小

  1. pad是内存对齐
  2. 上下粉色是cookie,记录分配内存的信息,操作系统用于回收内存

[]new一定要用[]delete,否则可能会发生内存泄漏


  1. []new会分配多四个字节,记录n个对象
  2. delete使用[]才会读取记录,调用n次析构函数
  3. delete不使用[],只调用1次析构函数
  4. 注意:并不是malloc这一块的内存发生泄漏,而是调用构造函数的对象发生了内存泄漏
  5. 如果[]new不需要调用构造函数分配内存,那么即使使用delete也不会发生内存泄漏,但是最好也要匹配使用
posted @ 2021-01-15 00:24  肥斯大只仔  阅读(76)  评论(0编辑  收藏  举报