正文

回到頂部

1. 調用普通版本的operator new拋出異常會發(fā)生什么?

Placement new和placement delete不是C++動物園中最常遇到的猛獸,所以你不用擔心你對它們不熟悉。當你像下面這樣實現一個new表達式的時候,回憶一下Item 16Item 17

1 Widget *pw = new Widget;

 

兩個函數會被調用:一個是調用operator new來分配內存,第二個是Widget的默認構造函數。

假設第一個調用成功了,但是調用第二個函數拋出了異常。在這種情況下,對步驟一中執(zhí)行的內存分配必須進行回滾。否則就會發(fā)生內存泄漏。客戶端代碼不能釋放內存,因為如果Widget構造函數拋出了異常,pw永遠不會賦值??蛻舳司蜎]有辦法得到指向需要釋放內存的指針。對步驟一進行回滾的責任就落在了C++運行時系統(tǒng)身上。

運行時系統(tǒng)很高興去調用與步驟1中調用的operator new版本相對應的operator delete,但是只有在它知道哪個operator delete(可能有許多)是合適的被調用函數的情況下才能做到。如果你正在處理的new和delete版本有著正常的簽名,那么這不是一個問題,因為正常的operator new,

1 void* operator new(std::size_t) throw(std::bad_alloc);

 

延伸閱讀

學習是年輕人改變自己的最好方式-Java培訓,做最負責任的教育,學習改變命運,軟件學習,再就業(yè),大學生如何就業(yè),幫大學生找到好工作,lphotoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網站設計培訓,網站建設培訓學習是年輕人改變自己的最好方式