new、delete、記憶體分配 的底層原理
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 都會正常釋放.
相關文章
- 記憶體(new delete )記憶體delete
- C++動態記憶體管理——new/deleteC++記憶體delete
- C++記憶體管理:new / delete 和 cookieC++記憶體deleteCookie
- iOS底層原理探究- NSObject 所佔記憶體iOSObject記憶體
- iOS記憶體不夠怎麼辦?-底層原理iOS記憶體
- 記憶體分配詳解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc記憶體
- iOS底層學習 - 記憶體管理之weak原理探究iOS記憶體
- MJiOS底層筆記--記憶體管理iOS筆記記憶體
- 深入理解golang:記憶體分配原理Golang記憶體
- iOS底層原理 記憶體管理 那些你不知道的原理彙總 — (12)iOS記憶體
- 從程式棧記憶體底層原理到Segmentation fault報錯記憶體Segmentation
- Golang記憶體分配內建函式之new函式Golang記憶體函式
- iOS底層原理(一):OC物件實際佔用記憶體與開闢記憶體關係iOS物件記憶體
- Go高階特性 14 | 記憶體分配:new 和 make 的使用場景Go記憶體
- 垃圾收集器與記憶體分配策略_記憶體分配策略記憶體
- <七>深入理解new和delete的原理delete
- 記憶體的分配與釋放,記憶體洩漏記憶體
- Android系統Bitmap記憶體分配原理與優化Android記憶體優化
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- 動態記憶體分配記憶體
- C語言的記憶體分配C語言記憶體
- C中的記憶體分配模型記憶體模型
- 軟體測試學習教程——過載new或delete來檢測記憶體洩漏delete記憶體
- Android系統Bitmap記憶體分配原理與最佳化Android記憶體
- MySQL底層概述—1.InnoDB記憶體結構MySql記憶體
- java-方法記憶體分配Java記憶體
- go記憶體分配器Go記憶體
- java基礎-記憶體分配Java記憶體
- hadoop 記憶體分配規則Hadoop記憶體
- C語言-記憶體分配C語言記憶體
- 記憶體分配策略學習記憶體
- 深度理解glibc記憶體分配記憶體
- Netty 中的記憶體分配淺析Netty記憶體
- Go記憶體分配和GC的理解Go記憶體GC
- Netty的底層原理Netty
- Volatile的底層原理
- HashMap的底層原理HashMap
- 【Java】 記憶體分配全面淺析Java記憶體