測試是否在數組周圍存放數組大小
運行結果:
可見,在數組周圍並沒有記錄數組的大小。
使用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 []並不需要知道數組有多少個元素,也不用管數組大小,整體的大小由操作系統來處理。
以上爲個人理解,如有錯誤,懇請指正。