淺談delete[]如何處理數組

測試是否在數組周圍存放數組大小在這裏插入圖片描述
運行結果:
在這裏插入圖片描述
可見,在數組周圍並沒有記錄數組的大小。

使用delete釋放數組和釋放單個元素空間應該是沒有區別的。
如delete[] arr, delete e;

釋放單個元素不用解釋,那麼釋放數組空間時是否需要獲取其元素個數呢?
個人認爲,這是不需要的。

大家都知道,在new一個對象時,執行的兩個操作,operator new申請內存,然後進行構造;
delete時,先析構,然後operator delete釋放。這裏我們只討論申請和釋放內存的過程。
主要是operator new[], operator delete[], 這兩個與數組有關的內存操作。

operator new的源碼如下:
在這裏插入圖片描述
實際只是根據sz參數執行了一個malloc操作,sz即size(要申請的內存的大小)。

operator new[]:
在這裏插入圖片描述
也是使用了sz參數,調用了operator new

我們來看一下operator new的參數值的意義。

重載運算符即可查看。
在這裏插入圖片描述
結果:
在這裏插入圖片描述
從運行結果可以知道,operator new[]的參數即爲要申請的總大小(然後就是malloc(40)),

那麼釋放數組時呢?
在這裏插入圖片描述
也僅是使用了指針,跟數組大小無關。

那麼怎麼知道這個指針對應的內存大小呢? – 由操作系統來維護。

操作系統維護一些內存塊區域:比如10B,20B,30B的內存區域。
當malloc(40)時,操作系統在40B的內存區裏分配 一塊內存,
在釋放時,查看指針位置是在40B區域裏,那麼就是釋放40B。

當然,不同的編譯器有不同的實現,不同的操作系統對內存管理也有不同的實現。

所以本文的結論是,delete []並不需要知道數組有多少個元素,也不用管數組大小,整體的大小由操作系統來處理。

以上爲個人理解,如有錯誤,懇請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章