C++|array new 和 array delete的堆內存細節

在C中, 堆內存的申請與釋放通過malloc()和free()來進行,而對於C++,其運算符函數new、delete不但封裝了malloc()和free(),還增加了一些額外的操作,來得更安全和便捷。

C++|array new 和 array delete的堆內存細節


C++|array new 和 array delete的堆內存細節

C++的new、delete與C的maoolc()、free()在array操作時有所不同,array new需與array delete匹配,也就是一個new []必須匹配delete []。

delete→釋放整塊內存,即使是new的動態對象數組。

delete[]→① 釋放整塊內存,即使是new的動態對象數組。② 釋放每個對象中指針成員指向的堆內存。

所以有new指針成員指向堆內存的類對象數組,不僅需要big three,還需要delete[]。而對於沒有指針成員指向堆內存的類對象,則可以使用默認的big three,即使new一個動態對象數組,也可以將delete[]寫成delete,但為了統一規範即避免意外考慮,對於new出的動態對象數組,統一配對delete[]為最佳考慮。

C++|array new 和 array delete的堆內存細節

由由圖可知,申請n個字節的內存,給出的內存還有額外部分,在這個內存塊的頭尾位置用一個字節來存儲這個內存塊的大小,如果申請動態數組,還有一個字節存儲某種數據類型的數量(數組元素數量)。此外,如果是Debug模式,還包含了32字節用來構建Debugger Header,用作調試信息。當然,還會考慮內存對齊,通過犧牲空間來獲取時間,以有更快的字節訪問速度。

delete[]:

C++|array new 和 array delete的堆內存細節

上述封裝了指針的類,當new這樣的類的對象數組時,對於C語言來說,相當於是要構建一個二維動態數組,具體細節請見:C|三種方法創建二維動態數組,通常需要用一個循環來free()多個指向堆內存的指針。而對於C++的delete,則只需增加一個[]即可告知編譯器,這裡釋放的是一個動態數組,需要釋放掉每個指針指向的堆內存塊。

ref

https://www.bilibili.com/video/BV1aW411H7Xa?p=8

-End-


分享到:


相關文章: