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 [] 時就可以取出這個保存的數,就知道了需要調用析 構函數多少次了。