Lua程式設計(八十二)

2021-09-18 07:10:57 字數 1441 閱讀 5408

lua中所有的結構都是動態的:他們會按需擴充套件,並且在可能時最後重新收縮。這意味著lua中記憶體分配失敗可能無處不在,幾乎所有的操作最終都可能面臨記憶體分配失敗。此外,許多操作也可能丟擲異常。

lua語言使用以異常來提示錯誤,而沒有在api的每個操作使用錯誤碼。lua使用了c語言中的setjmp機制來解決這個問題,setjmp營造了乙個類似異常處理的機制。

在編寫庫**時(被lua呼叫的c函式),由於lua會捕獲所有異常。因此,我們使用longjmp並不用進行額外的操作。

如果應用呼叫了lua api中的函式,就可能發生錯誤。lua語言通過長跳轉來提示錯誤,但是如果沒有相應的setjmp, 直譯器就無法進行長跳轉。此時,api中的任何錯誤都會導致lua呼叫緊急函式,當這個函式返回後,應用就會退出。可以通過lua_atpanic來設定自己的緊急函式。

要正確處理應用**中的錯誤,就必須通過lua語言呼叫我們自己的**,這樣lua語言才能設定合適的上下文來捕捉異常,即在setjmp的上下文中執行**。類似於通過函式pcall在保護模式下執行lua**,我們也可以使用函式pcall執行c**。具體而言,可以把c**封裝到乙個函式f中,然後使用lua_pcall呼叫這個函式f。通過這種方式,c**就可在保護模式下執行。即便發生記憶體分配失敗,函式lua_pcall也能返回乙個對應的錯誤碼:

static

intfoo

(lua_state *l)

intsecure_foo

(lua_state *l)

上述示例中,無論發生什麼,呼叫secure_foo時都會返回乙個布林值,來表示執行foo是否成功。需要注意到的是,棧中已經預先分配了空間,而且函式lua_puchcfunction不會分配記憶體,這樣才不會引發錯誤。

Lua程式設計(八十二)

除了上述在c語言和棧之間交換資料的函式外,c api還提供了下列用於通用棧操作的函式 int lua gettop lua state l void lua settop lua state l,int index void lua pushvalue lua state l,int index v...

LeetCode小演算法記錄(八十二)硬幣

硬幣。給定數量不限的硬幣,幣值為25分 10分 5分和1分,編寫 計算n分有幾種表示法。結果可能會很大,你需要將結果模上1000000007 示例1 輸入 n 5 輸出 2 解釋 有兩種方式可以湊成總金額 5 55 1 1 1 1 1 示例2 輸入 n 10 輸出 4 解釋 有四種方式可以湊成總金額...

愛情八十二課,愛情三國殺

一周以來,我一直想著這個女孩。她眉目清秀,溫柔恬靜。只是愁雲緊鎖,怎乙個 鬱悶 了得。有一條長長的刀痕,赫然嵌在她白嫩的手腕上 這是她曾經放棄自己的證據,也是她來尋求心理幫助的原因。她是個第三者,是別人婚姻中不光彩的第三方。這樣的角色,讓她覺得自己就像只老鼠,走上街,人人喊打。可是她真的愛他,情願揹...