new、delete、記憶體分配 的底層原理

三三三三三三外發表於2020-11-06

new

  • 先呼叫operator new函式為物件分配空間
  • 然後呼叫建構函式, 初始化物件 (物件也可能會有申請堆空間)

在這裡插入圖片描述

delete

  • 先呼叫物件的解構函式, 是把物件裡可能申請的堆空間進行釋放
  • 然後再呼叫operator delete函式釋放為物件分配的空間.

在這裡插入圖片描述

實際分配記憶體的大小

  • 除錯模式會有額外的灰色模組
  • 非除錯模式沒有額外灰色模組
  • 上下cookies(紅色部分)是必要的, 他用來記錄一些資訊便於之後的回收
  • VC下申請的記憶體都是16B的倍數, 需要進行alignment
    在這裡插入圖片描述

array new 搭配 array delete

  • VC下陣列會用一個額外變數記錄陣列長度

在這裡插入圖片描述

  • 因為delete底層實現分為兩步, 首先呼叫解構函式, 然後再執行operator delete
  • 使用array delete (delete [])的目的是執行相應次數的解構函式, 如果不是array delete將只會執行一次解構函式, 造成物件內部申請的記憶體空間洩漏
  • 之後的operator delete釋放的是作業系統為物件分配的空間, 相關資訊在上下cookies中, 無論是delete [] 還是 delete 都會正常釋放.

在這裡插入圖片描述
侯捷:C++物件導向高階開發

相關文章