最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 中try finally關(guān)鍵字詳解

 更新時間:2016年05月27日 11:54:37   作者:原來...  
本文給大家介紹C++ 中try finally關(guān)鍵字的相關(guān)知識,非常不錯,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧

try-finally語句是Microsoft對C和C++語言的擴展,它能使32位的目標程序在異常出現(xiàn)時,有效保證一些資源能夠被及時清除,這些資源的清除任務(wù)可以包括例如內(nèi)存的釋放,文件的關(guān)閉,文件句柄的釋放等等。try-finally語句特別適合這樣的情況下使用,例如一個例程(函數(shù))中,有幾個地方需要檢測一個錯誤,并且在錯誤出現(xiàn)時,函數(shù)可能提前返回。

#include <windows.h>
#include <stdio.h>

try-finally語句的語法與try-except很類似,稍有不同的是,__finally后面沒有一個表達式,這是因為try- finally語句的作用不是用于異常處理,所以它不需要一個表達式來判斷當前異常錯誤的種類。另外,與try-except語句類似,try- finally也可以是多層嵌套的,并且一個函數(shù)內(nèi)可以有多個try-finally語句,不管它是嵌套的,或是平行的。當然,try-finally多層嵌套也可以是跨函數(shù)的。這里不一一列出示例,大家可以自己測試一番。

另外,對于上面示例程序的運行結(jié)果,是不是覺得有點意料之外呢?因為 __finally塊中的put(“__finally塊中”)語句也被執(zhí)行了。是的,沒錯!這就是try-finally語句最具有魔幻能力的地方,即 “不管在何種情況下,在離開當前的作用域時,finally塊區(qū)域內(nèi)的代碼都將會被執(zhí)行到”。呵呵!這的確是很厲害吧!為了驗證這條規(guī)則,下面來看一個更典型示例,代碼如下:

#include <stdio.h>
void main()
{
puts(“hello”);
__try
{
puts(“__try塊中”);
// 注意,下面return語句直接讓函數(shù)返回了
return;
}
__finally
{
puts(“__finally塊中”);
}
puts(“world”);
}
上面的程序運行結(jié)果如下:
hello
__try塊中
__finally塊中
Press any key to continue
void main()
{
puts(“hello”);
__try
{
puts(“__try塊中”);
}
// 注意,這里不是__except塊,而是__finally取代
__finally
{
puts(“__finally塊中”);
}
puts(“world”);
}

上面的程序運行結(jié)果如下:

hello
__try塊中
__finally塊中
world
Press any key to continue

總結(jié)__finally塊被執(zhí)行的流程時,無外乎三種情況。第一種就是順序執(zhí)行到__finally塊區(qū)域內(nèi)的代碼,這種情況很簡單,容易理解;第二種就是goto語句或return語句引發(fā)的程序控制流離開當前__try塊作用域時,系統(tǒng)自動完成對__finally塊代碼的調(diào)用;第三種就是由于在__try塊中出現(xiàn)異常時,導(dǎo)致程序控制流離開當前__try塊作用域,這種情況下也是由系統(tǒng)自動完成對__finally塊的調(diào)用。無論是第 2種,還是第3種情況,毫無疑問,它們都會引起很大的系統(tǒng)開銷,編譯器在編譯此類程序代碼時,它會為這兩種情況準備很多的額外代碼。一般第2種情況,被稱為“局部展開(LocalUnwinding)”;第3種情況,被稱為“全局展開(GlobalUnwinding)”。在后面闡述SEH實現(xiàn)的時候會詳細分析到這一點。

第3種情況,也即由于出現(xiàn)異常而導(dǎo)致的“全局展開”,對于程序員而言,這也許是無法避免的,因為你在利用異常處理機制提高程序可靠健壯性的同時,不可避免的會引起性能上其它的一些開銷。呵呵!這世界其實也算瞞公平的,有得必有失。

  但是,對于第2種情況,程序員完全可以有效地避免它,避免“局部展開”引起的不必要的額外開銷。實際這也是與結(jié)構(gòu)化程序設(shè)計思想相一致的,也即一個程序模塊應(yīng)該只有一個入口和一個出口,程序模塊內(nèi)盡量避免使用goto語句等。但是,話雖如此,有時為了提高程序的可讀性,程序員在編寫代碼時,有時可能不得不采用一些與結(jié)構(gòu)化程序設(shè)計思想相悖的做法,例如,在一個函數(shù)中,可能有多處的return語句。針對這種情況,SEH提供了一種非常有效的折衷方案,那就是__leave關(guān)鍵字所起的作用,它既具有像goto語句和return語句那樣類似的作用(由于檢測到某個程序運行中的錯誤,需要馬上離開當前的 __try塊作用域),但是又避免了“局部展開” 的額外開銷。還是看個例子吧!代碼如下:

#include <stdio.h>
void test()
{
puts(“hello”);
__try
{
int* p;
puts(“__try塊中”);
// 直接跳出當前的__try作用域
__leave;
p = 0;
*p = 25;
}
__finally
{
// 這里會被執(zhí)行嗎?當然
puts(“__finally塊中”);
}
puts(“world”);
}
void main()
{
__try
{
test();
}
__except(1)
{
puts(“__except塊中”);
}
}

上面的程序運行結(jié)果如下:

hello
__try塊中
__finally塊中
world
Press any key to continue

以上所述是小編給大家介紹的C++ 中try finally關(guān)鍵字的相關(guān)知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 一文帶你了解Qt中槽的使用

    一文帶你了解Qt中槽的使用

    這篇文章主要為大家詳細介紹了Qt中槽的使用教程,文中的示例代碼講解詳細,對我們學(xué)習(xí)Qt有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • C/C++高精度運算(大整數(shù)運算)詳細講解

    C/C++高精度運算(大整數(shù)運算)詳細講解

    高精度算法的本質(zhì)是把大數(shù)拆成若干固定長度的塊,然后對每一塊進行相應(yīng)的運算,下面這篇文章主要給大家介紹了關(guān)于C/C++高精度運算(大整數(shù)運算)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié)

    C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié)

    這篇文章主要介紹了C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié),包括getpw()函數(shù)和getpwnam()函數(shù)以及getpwuid()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C++深度探索運算符重載和返回值優(yōu)化

    C++深度探索運算符重載和返回值優(yōu)化

    這篇文章主要介紹了C++運算符重載及編譯器返回值優(yōu)化,C++當中除了函數(shù)可以重載之外,其實運算符也是可以重載的,下面一起來詳細了解吧
    2022-04-04
  • c++與c中的數(shù)組初始化默認值如何為0

    c++與c中的數(shù)組初始化默認值如何為0

    這篇文章主要介紹了c++與c中的數(shù)組初始化默認值如何為0問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言詳細分析講解關(guān)鍵字goto與void的作用

    C語言詳細分析講解關(guān)鍵字goto與void的作用

    我們在C語言中經(jīng)常會見到void,也會偶爾見到goto,那么C語言中既然有g(shù)oto,為什么我們在代碼中見的很少呢?在以前很多的項目經(jīng)驗中,我們得到這樣一條潛規(guī)則:一般項目都是禁用goto的,程序質(zhì)量與goto的出現(xiàn)次數(shù)成反比。自后也就造成了我們一般不會使用goto
    2022-04-04
  • C 指針和OC 對象之間的轉(zhuǎn)換方法

    C 指針和OC 對象之間的轉(zhuǎn)換方法

    這篇文章主要給大家介紹了關(guān)于C 指針和OC 對象之間的轉(zhuǎn)換方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 一文詳解C++中的mutable關(guān)鍵字

    一文詳解C++中的mutable關(guān)鍵字

    在C++中mutable關(guān)鍵字正如字面意思所示,表示「可變的」之意,一般在以下兩種情況中使用較多,一是修飾類中的變量,用來突破const的限制,二是在Lambda表達式中使用,用來捕獲修改表達式之外的變量值,下面我們就針對這兩種使用場景逐個介紹
    2023-10-10
  • 老生常談C語言中指針的使用

    老生常談C語言中指針的使用

    這篇文章主要為大家詳細介紹了C語言中指針的使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++ vector容器實現(xiàn)貪吃蛇小游戲

    C++ vector容器實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C++ vector容器實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評論

新绛县| 彰化县| 萨嘎县| 东乌| 永宁县| 天柱县| 延寿县| 崇左市| 千阳县| 东至县| 佛冈县| 杂多县| 青河县| 曲松县| 息烽县| 淮滨县| 达日县| 乌鲁木齐县| 如皋市| 刚察县| 富顺县| 永福县| 威远县| 临洮县| 阿勒泰市| 法库县| 东城区| 县级市| 托里县| 栖霞市| 互助| 江安县| 浦城县| 彩票| 平果县| 休宁县| 吴忠市| 永泰县| 南川市| 焦作市| 双城市|