正文

回到頂部

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

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

1 Widget *pw = new Widget;

 

兩個函數(shù)會被調(diào)用:一個是調(diào)用operator new來分配內(nèi)存,第二個是Widget的默認(rèn)構(gòu)造函數(shù)。

假設(shè)第一個調(diào)用成功了,但是調(diào)用第二個函數(shù)拋出了異常。在這種情況下,對步驟一中執(zhí)行的內(nèi)存分配必須進(jìn)行回滾。否則就會發(fā)生內(nèi)存泄漏。客戶端代碼不能釋放內(nèi)存,因?yàn)槿绻鸚idget構(gòu)造函數(shù)拋出了異常,pw永遠(yuǎn)不會賦值。客戶端就沒有辦法得到指向需要釋放內(nèi)存的指針。對步驟一進(jìn)行回滾的責(zé)任就落在了C++運(yùn)行時(shí)系統(tǒng)身上。

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

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

 

網(wǎng)友評論