簡體   English   中英

管理Lua light userdata的正確方法

[英]Proper way to manage Lua light userdata

我對使用lua_pushlightuserdata()傳遞給Lua的C ++創建的對象有一個void * Lua可以通過將其傳遞給Lua CFunctions並使用lua_touserdata()檢索它來對該輕型用戶數據執行某些操作。 在將來的某個時刻,C ++對象被其所有者(C ++)破壞,釋放內存並設置為null。 但是,Lua仍然引用了這個指針,它不知道它已經被破壞了。

現在我接受這個userdata的Lua函數確保指針有效。 但是,告訴Lua他們對light userdata的引用不再有效的最佳方法是什么? 我是否將一個IsValid(lightuserdata)函數暴露給Lua,以便它可以查詢狀態? 或者是否有一種我錯過的更好的方法。

根據我的經驗,我發現讓Lua擁有對象更容易,並且您需要完整的userdata來保存指針或完成對象在userdata內存區域內。 完整的userdata可以使用__gc元方法進行元解,因此只有在最后一個引用在Lua端進行垃圾收集后才會銷毀對象。

至少不要通過lightuserdata向Lua公開原始對象的原始指針,它實際上不適用於本機對象的生命周期管理。 使它成為Lua擁有的對象。 在最簡單的情況下,它可以是一個Lua對象(完整用戶數據),其中包含指向真實本機對象的智能指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM