如果申請的是普通的內置類型的空間
1、如果是申請的是0byte,強制轉換為1byte
2、使用名為operator new 的標准庫函數,如果是數組則調用名為operator new[]的標准庫函數,申請相對應的空間,如果沒有足夠的空間或其他問題且沒有定義_new_hanlder,那麼會拋出bad_alloc的異常並結束程序
3、如果定義了_new_hanlder回調函數,那麼會一直不停的調用這個函數直到問題被解決為止。
4、內存申請成功,返回申請到的內存的首地址。
如果申請的是類的空間
1、如果是申請的是0byte,強制轉換為1byte
2、使用名為operator new的標准庫函數,如果是數組則調用名為operator new[]的標准庫函數,申請相對應的空間,如果沒有足夠的空間或其他問題且沒有定義_new_hanlder,那麼會拋出bad_alloc的異常並結束程序
3、如果定義了_new_hanlder回調函數,那麼會一直不停的調用這個函數直到問題被解決為止。
4、如果這個類沒有定義任何構造函數,析構函數,且編譯器沒有合成,那麼下面的步驟跟申請普通的內置類型是一樣的。
5、如果有構造函數或者析構函數,那麼會調用一個庫函數,具體什麼庫函數依編譯器不同而不同,這個庫函數會回調類的構造函數。
6、如果在構造函數中發生異常,那麼會釋放剛剛申請的空間並返回異常
7、返回申請到的內存的首地址
注意上面的operator new標准庫函數跟new表達式的區別!!!!!!
我們可以通過set_new_hanlder去設置_new_hanlder,具體做法如下:
void hanldermemory(){;}
set_new_hanlder(hanldermemory);這只回調函數為hanldermemory
或者set_new_hanlder(NULL);這裡沒有設置回調函數