正文

回到頂部

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

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

1 Widget *pw = new Widget;

 

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

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

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

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

 

延伸閱讀

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