自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

VC++編譯異常相關(guān)說(shuō)明

開(kāi)發(fā) 后端
VC++是微軟公司開(kāi)發(fā)的一個(gè)IDE(集成開(kāi)發(fā)環(huán)境),換句話說(shuō),就是使用c++的一個(gè)開(kāi)發(fā)平臺(tái),但是有時(shí)會(huì)出現(xiàn)VC++編譯異常的現(xiàn)象。

要想學(xué)習(xí)好VC必須具備良好的C/C++的基礎(chǔ),必要的英語(yǔ)閱讀能力也是必不可少的,因?yàn)榇罅康募夹g(shù)文檔多以英文形式發(fā)布,否則就會(huì)導(dǎo)致VC++編譯異常,這大大的影響了程序員的效率。

回憶一下我在第一節(jié)中介紹的EXCEPTION_REGISTRATION結(jié)構(gòu),我們?cè)盟虿僮飨到y(tǒng)注冊(cè)了發(fā)生異常時(shí)要被調(diào)用的回調(diào)函數(shù)。VC++也是這么做的,不過(guò)它擴(kuò)展了這個(gè)結(jié)構(gòu)的語(yǔ)義,在它的后面添加了兩個(gè)新字段:

  1. struct EXCEPTION_REGISTRATION   
  2. {   
  3.     EXCEPTION_REGISTRATION* prev;   
  4.     DWORD handler;   
  5.     int id;   
  6.     DWORD ebp;   
  7. };  

VC++編譯異常會(huì)為絕大部分函數(shù)③添加一個(gè)EXCEPTION_REGISTRATION類型的局部變量,它的最后一個(gè)字段(ebp)與棧楨指針指向的位置重疊。函 數(shù)的序言創(chuàng)建這個(gè)結(jié)構(gòu)并把它注冊(cè)給操作系統(tǒng),尾聲則恢復(fù)主調(diào)函數(shù)的EXCEPTION_REGISTRATION。id字段的意義我將在下一節(jié)介紹。

VC++編譯函數(shù)時(shí)會(huì)為它生成兩部分?jǐn)?shù)據(jù):
a)異?;卣{(diào)函數(shù)
b)一個(gè)包含函數(shù)重要信息的數(shù)據(jù)結(jié)構(gòu),這些信息包括catch塊、這些塊的地址和這些塊所關(guān)心的異常的類型等等。我把這個(gè)結(jié)構(gòu)稱為funcinfo,有關(guān)它的詳細(xì)討論也在下一節(jié)。

是考慮了異常處理之后的運(yùn)行時(shí)堆棧。widget的異?;卣{(diào)函數(shù)位于由FS:[0]指向的異常處理鏈的開(kāi)始位置(這是由widget的序言設(shè)置的)。

異常處理程序把widget的funcinfo結(jié)構(gòu)的地址交給函數(shù)__CxxFrameHandler,__CxxFrameHandler會(huì)檢查這個(gè)結(jié) 構(gòu)看函數(shù)中有沒(méi)有catch塊對(duì)當(dāng)前的異常感興趣。

如果沒(méi)有的話,它就返回ExceptionContinueSearch給操作系統(tǒng),于是操作系統(tǒng)會(huì)從 異常處理鏈表中取得下一個(gè)結(jié)點(diǎn),并調(diào)用它的異常處理程序(也就是調(diào)用當(dāng)前函數(shù)的那個(gè)函數(shù)的異常處理程序)。

這一過(guò)程將一直進(jìn)行下去——直到處理程序找到一個(gè)能處理當(dāng)前異常的catch塊為止,這時(shí)它就不再返回操作系統(tǒng)了。但是在調(diào)用catch塊之前(由于有 funcinfo結(jié)構(gòu),所以知道catch塊的入口,參見(jiàn)圖3),必須進(jìn)行堆棧展開(kāi),也就是清理掉當(dāng)前函數(shù)的棧楨下面的所有其他的棧楨。這個(gè)操作稍微有點(diǎn) 復(fù)雜。

因?yàn)椋寒惓L幚沓绦虮仨氄业疆惓0l(fā)生時(shí)生存在這些棧楨上的所有局部對(duì)象,VC++編譯異常并依次調(diào)用它們的析構(gòu)函數(shù)。后面我將對(duì)此進(jìn)行詳細(xì)介紹。 異常處理程序把這項(xiàng)工作委托給了各個(gè)棧楨自己的異常處理程序。從FS:[0]指向的異常處理鏈的第一個(gè)結(jié)點(diǎn)開(kāi)始,它依次調(diào)用每個(gè)結(jié)點(diǎn)的處理程序,告訴它堆 棧正在展開(kāi)。

與之相呼應(yīng),這些處理程序會(huì)調(diào)用每個(gè)局部對(duì)象的析構(gòu)函數(shù),然后返回。此過(guò)程一直進(jìn)行到與異常處理程序自身相對(duì)應(yīng)的那個(gè)結(jié)點(diǎn)為止。 由于catch塊是函數(shù)的一部分,所以它使用的也是函數(shù)的棧楨。因此,在調(diào)用catch塊之前,異常處理程序必須激活它所隸屬的函數(shù)的棧楨。

其次,每個(gè)catch塊都只接受一個(gè)參數(shù),VC++編譯異常其類型是它希望捕獲的異常的類型。異常處理程序必須把異常對(duì)象本身或者是異常對(duì)象的引用拷貝到catch塊的棧 楨上,編譯器在funcinfo中記錄了相關(guān)信息,處理程序根據(jù)這些信息就能知道到哪去拷貝異常對(duì)象了。

【編輯推薦】

  1. C與C++中標(biāo)準(zhǔn)輸入實(shí)現(xiàn)方式上的一點(diǎn)區(qū)別
  2. C++編譯器如何對(duì)Const常量進(jìn)行分配存儲(chǔ)空間
  3. C++類庫(kù)設(shè)計(jì)的基本構(gòu)思與方法
  4. 玩轉(zhuǎn)C++語(yǔ)言的幾種方法
  5. 如何更好的進(jìn)行C++代碼編制
責(zé)任編輯:chenqingxiang 來(lái)源: NET130
相關(guān)推薦

2010-01-28 15:56:38

VC++ 6.0編譯

2010-01-27 17:42:58

VC++開(kāi)發(fā)環(huán)境

2010-02-01 15:41:55

擴(kuò)展Python

2010-01-22 10:44:10

VC++應(yīng)用程序

2010-06-09 17:20:05

Mrtg window

2010-02-01 17:41:54

Python 解釋器

2010-02-01 16:32:49

Python腳本

2009-12-31 14:50:57

ADO組件

2009-12-25 15:57:14

ADO調(diào)用

2009-12-24 15:42:01

ADO類庫(kù)

2010-01-08 14:48:26

Javascritp處

2009-12-29 16:33:35

ADO.Net Tea

2010-01-05 17:35:09

JSON數(shù)組格式

2010-01-12 18:06:58

VC環(huán)境

2009-12-23 09:26:56

ADO.NET屬性

2010-01-21 17:22:21

VC++

2010-01-07 09:31:27

Json數(shù)據(jù)異常

2011-07-03 16:19:19

2010-01-26 13:29:46

VC++應(yīng)用程序

2011-07-13 11:20:55

VC++ODBC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)