正文
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 16和Item 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);
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26