63、new和delete的實現原理, delete是如何知道釋放內存的大小的額?


1、 new簡單類型直接調用operator new分配內存;

而對於復雜結構,先調用operator new分配內存,然后在分配的內存上調用構造函數;

對於簡單類型,new[]計算好大小后調用operator new;

對於復雜數據結構,new[]先調用operator new[]分配內存,然后在p的前四個字節寫入數組大小n,然 后調用n次構造函數,針對復雜類型,new[]會額外存儲數組大小;

① new表達式調用一個名為operator new(operator new[])函數,分配一塊足夠大的、原始的、未命 名的內存空間;

② 編譯器運行相應的構造函數以構造這些對象,並為其傳入初始值;

③ 對象被分配了空間並構造完成,返回一個指向該對象的指針。

 

2、 delete簡單數據類型默認只是調用free函數;復雜數據類型先調用析構函數再調用operator delete;針對簡單類型,delete和delete[]等同。假設指針p指向new[]分配的內存。因為要4字節存儲數 組大小,實際分配的內存地址為[p-4],系統記錄的也是這個地址。delete[]實際釋放的就是p-4指向的內 存。而delete會直接釋放p指向的內存,這個內存根本沒有被系統記錄,所以會崩潰。

 

3、 需要在 new [] 一個對象數組時,需要保存數組的維度,C++ 的做法是在分配數組空間時多分配了 4 個字節的大小,專門保存數組的大小,在 delete [] 時就可以取出這個保存的數,就知道了需要調用析 構函數多少次了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM