程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ new 的工作過程

C++ new 的工作過程

編輯:C++入門知識


如果申請的是普通的內置類型的空間
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);這裡沒有設置回調函數

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved