C++new的工作方式

dongyu2013發表於2014-05-19

如果申請的是普通的內建型別的空間
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);這裡沒有設定回撥函式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1164448/,如需轉載,請註明出處,否則將追究法律責任。

相關文章