新聞中心
要想學習好VC必須具備良好的C/C++的基礎,必要的英語閱讀能力也是必不可少的,因為大量的技術文檔多以英文形式發(fā)布,否則就會導致VC++編譯異常,這大大的影響了程序員的效率。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供彭水苗族土家族網(wǎng)站建設、彭水苗族土家族做網(wǎng)站、彭水苗族土家族網(wǎng)站設計、彭水苗族土家族網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、彭水苗族土家族企業(yè)網(wǎng)站模板建站服務,10年彭水苗族土家族做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。
回憶一下我在第一節(jié)中介紹的EXCEPTION_REGISTRATION結(jié)構(gòu),我們曾用它向操作系統(tǒng)注冊了發(fā)生異常時要被調(diào)用的回調(diào)函數(shù)。VC++也是這么做的,不過它擴展了這個結(jié)構(gòu)的語義,在它的后面添加了兩個新字段:
- struct EXCEPTION_REGISTRATION
- {
- EXCEPTION_REGISTRATION* prev;
- DWORD handler;
- int id;
- DWORD ebp;
- };
VC++編譯異常會為絕大部分函數(shù)③添加一個EXCEPTION_REGISTRATION類型的局部變量,它的最后一個字段(ebp)與棧楨指針指向的位置重疊。函 數(shù)的序言創(chuàng)建這個結(jié)構(gòu)并把它注冊給操作系統(tǒng),尾聲則恢復主調(diào)函數(shù)的EXCEPTION_REGISTRATION。id字段的意義我將在下一節(jié)介紹。
VC++編譯函數(shù)時會為它生成兩部分數(shù)據(jù):
a)異?;卣{(diào)函數(shù)
b)一個包含函數(shù)重要信息的數(shù)據(jù)結(jié)構(gòu),這些信息包括catch塊、這些塊的地址和這些塊所關心的異常的類型等等。我把這個結(jié)構(gòu)稱為funcinfo,有關它的詳細討論也在下一節(jié)。
是考慮了異常處理之后的運行時堆棧。widget的異?;卣{(diào)函數(shù)位于由FS:[0]指向的異常處理鏈的開始位置(這是由widget的序言設置的)。
異常處理程序把widget的funcinfo結(jié)構(gòu)的地址交給函數(shù)__CxxFrameHandler,__CxxFrameHandler會檢查這個結(jié) 構(gòu)看函數(shù)中有沒有catch塊對當前的異常感興趣。
如果沒有的話,它就返回ExceptionContinueSearch給操作系統(tǒng),于是操作系統(tǒng)會從 異常處理鏈表中取得下一個結(jié)點,并調(diào)用它的異常處理程序(也就是調(diào)用當前函數(shù)的那個函數(shù)的異常處理程序)。
這一過程將一直進行下去——直到處理程序找到一個能處理當前異常的catch塊為止,這時它就不再返回操作系統(tǒng)了。但是在調(diào)用catch塊之前(由于有 funcinfo結(jié)構(gòu),所以知道catch塊的入口,參見圖3),必須進行堆棧展開,也就是清理掉當前函數(shù)的棧楨下面的所有其他的棧楨。這個操作稍微有點 復雜。
因為:異常處理程序必須找到異常發(fā)生時生存在這些棧楨上的所有局部對象,VC++編譯異常并依次調(diào)用它們的析構(gòu)函數(shù)。后面我將對此進行詳細介紹。 異常處理程序把這項工作委托給了各個棧楨自己的異常處理程序。從FS:[0]指向的異常處理鏈的第一個結(jié)點開始,它依次調(diào)用每個結(jié)點的處理程序,告訴它堆 棧正在展開。
與之相呼應,這些處理程序會調(diào)用每個局部對象的析構(gòu)函數(shù),然后返回。此過程一直進行到與異常處理程序自身相對應的那個結(jié)點為止。 由于catch塊是函數(shù)的一部分,所以它使用的也是函數(shù)的棧楨。因此,在調(diào)用catch塊之前,異常處理程序必須激活它所隸屬的函數(shù)的棧楨。
其次,每個catch塊都只接受一個參數(shù),VC++編譯異常其類型是它希望捕獲的異常的類型。異常處理程序必須把異常對象本身或者是異常對象的引用拷貝到catch塊的棧 楨上,編譯器在funcinfo中記錄了相關信息,處理程序根據(jù)這些信息就能知道到哪去拷貝異常對象了。
【編輯推薦】
- C與C++中標準輸入實現(xiàn)方式上的一點區(qū)別
- C++編譯器如何對Const常量進行分配存儲空間
- C++類庫設計的基本構(gòu)思與方法
- 玩轉(zhuǎn)C++語言的幾種方法
- 如何更好的進行C++代碼編制
網(wǎng)站標題:VC++編譯異常相關說明
文章URL:http://www.dlmjj.cn/article/djcgdji.html


咨詢
建站咨詢
