- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前面临的问题是,您不能对 Lua 5.1 中的表使用 __gc
方法,因为它们是在 Lua 5.2 中实现的。但是,我想在收集 lua 表后释放分配的 native 资源。是否有可能制定一个解决方法,让我在 Lua 5.2 中为 Lua 5.1 提供 __gc
元方法的功能?
最佳答案
在 lua 5.1 中,唯一与 __gc
元方法一起工作的 lua 值是 userdata
。自然地,任何 hack 或解决方法都必须以某种方式涉及 userdata
。通常没有办法只从 lua 端创建新用户数据,但是有一个“隐藏”未记录的函数 newproxy
可以做到这一点。
newproxy
采用可选的 bool 或 userdata 参数。如果你传入 true
那么你会得到一个附加了新元表的用户数据。如果您传入另一个 userdata
,那么新的 userdata 将被分配与传入的相同的元表。
所以现在你可以拼凑一个函数,使 __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
在表上得到正式支持。
关于表的 __gc 元方法的 Lua 5.1 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27426704/
Lua 5.2(与 5.1 相比)支持表的 __gc。 LuaJIT 有没有借用这个不错的功能? (我进行了谷歌搜索,并检查了 LuaJIT 的 Change History 但找不到答案。) 最佳答
我在 Lua 模块中有一个用 C 编写的完整用户数据。用户数据有 __gc() 元方法,由垃圾收集器调用。 lua 解释器在 __gc() 调用后释放 userdata 内存,还是我必须在 __gc(
我有一个 C++ 项目,我已经使用 C++/CLI 成功地用 .NET 类包装了它。我在托管 C++ 中定义包装器类。我是否需要将这些类标记为 __gc 以便对这些类进行垃圾回收?或者 .NET 框架
我目前面临的问题是,您不能对 Lua 5.1 中的表使用 __gc 方法,因为它们是在 Lua 5.2 中实现的。但是,我想在收集 lua 表后释放分配的 native 资源。是否有可能制定一个解决方
我在我的 C api 中使用了 malloc 用户数据。我应该在哪里释放它? 我应该为该用户数据编写一个__gc 方法,并在里面释放 吗?如果是,这不是双重释放,因为垃圾收集器也会释放它吗? 最佳答案
当用户数据值被重新分配时,即 a = lib.new() a = b 在哪里a , b ,以及 lib.new() 的结果都是定义了 __gc 的用户数据元事件,是否会为 a 的两个值(即 lib.n
我是一名优秀的程序员,十分优秀!