new、delete、内存分配 的底层原理

new

  • 先调用operator new函数为对象分配空间
  • 然后调用构造函数, 初始化对象 (对象也可能会有申请堆空间)

new、delete、内存分配 的底层原理

delete

  • 先调用对象的析构函数, 是把对象里可能申请的堆空间进行释放
  • 然后再调用operator delete函数释放为对象分配的空间.

new、delete、内存分配 的底层原理

实际分配内存的大小

  • 调试模式会有额外的灰色模块
  • 非调试模式没有额外灰色模块
  • 上下cookies(红色部分)是必要的, 他用来记录一些信息便于之后的回收
  • VC下申请的内存都是16B的倍数, 需要进行alignment
    new、delete、内存分配 的底层原理

array new 搭配 array delete

  • VC下数组会用一个额外变量记录数组长度

new、delete、内存分配 的底层原理

  • 因为delete底层实现分为两步, 首先调用析构函数, 然后再执行operator delete
  • 使用array delete (delete [])的目的是执行相应次数的析构函数, 如果不是array delete将只会执行一次析构函数, 造成对象内部申请的内存空间泄漏
  • 之后的operator delete释放的是操作系统为对象分配的空间, 相关信息在上下cookies中, 无论是delete [] 还是 delete 都会正常释放.

new、delete、内存分配 的底层原理
侯捷:C++面向对象高级开发