[英]Lua 5.1 workaround for __gc metamethod for tables
我目前面臨的問題是你不能在Lua 5.1中對表使用__gc
方法,因為它們是在Lua 5.2中實現的。 但是,我想在收集lua表后釋放已分配的本機資源。 是否有可能在Lua 5.2中為Lua 5.1提供__gc
metamethod的功能解決方法?
在lua 5.1中,使用__gc
元方法的唯一lua值是userdata
。 當然任何黑客或替代方法將不得不涉及userdata
以某種方式。 通常沒有辦法從lua端創建newuserdata,但是有一個“ 隱藏 ”的未記錄的函數newproxy
就是這樣做的。
newproxy
采用可選的bool或userdata參數。 如果你傳入true
那么你得到一個帶有新metatable的userdata。 如果您在另一傳遞userdata
,則新用戶數據將被分配相同的metatable作為一個傳入。
所以現在你可以將一個能使__gc
工作的函數組合在一起:
function setmt__gc(t, mt)
local prox = newproxy(true)
getmetatable(prox).__gc = function() mt.__gc(t) end
t[prox] = true
return setmetatable(t, mt)
end
並快速測試以確認行為:
iscollected = false
function gctest(self)
iscollected = true
print("cleaning up:", self)
end
test = setmt__gc({}, {__gc = gctest})
collectgarbage()
assert(not iscollected)
test = nil
collectgarbage()
assert(iscollected)
請注意,lua 5.2+及更高版本不再具有newproxy
因為表上正式支持__gc
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.