正文
1. 調(diào)用普通版本的operator new拋出異常會發(fā)生什么?
Placement new和placement delete不是C++動物園中最常遇到的猛獸,所以你不用擔心你對它們不熟悉。當你像下面這樣實現(xiàn)一個new表達式的時候,回憶一下Item 16和Item 17:
1 Widget *pw = new Widget;
兩個函數(shù)會被調(diào)用:一個是調(diào)用operator new來分配內(nèi)存,第二個是Widget的默認構造函數(shù)。
假設第一個調(diào)用成功了,但是調(diào)用第二個函數(shù)拋出了異常。在這種情況下,對步驟一中執(zhí)行的內(nèi)存分配必須進行回滾。否則就會發(fā)生內(nèi)存泄漏??蛻舳舜a不能釋放內(nèi)存,因為如果Widget構造函數(shù)拋出了異常,pw永遠不會賦值。客戶端就沒有辦法得到指向需要釋放內(nèi)存的指針。對步驟一進行回滾的責任就落在了C++運行時系統(tǒng)身上。
運行時系統(tǒng)很高興去調(diào)用與步驟1中調(diào)用的operator new版本相對應的operator delete,但是只有在它知道哪個operator delete(可能有許多)是合適的被調(diào)用函數(shù)的情況下才能做到。如果你正在處理的new和delete版本有著正常的簽名,那么這不是一個問題,因為正常的operator new,
1 void* operator new(std::size_t) throw(std::bad_alloc);