簡體   English   中英

用於表的__gc元方法的Lua 5.1解決方法

[英]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)

IDEOne演示

請注意,lua 5.2+及更高版本不再具有newproxy因為表上正式支持__gc

暫無
暫無

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

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