在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
我们都知道,lua具有自动内存管理,我们只管创建对象,无需删除对象,对于不再需要的对象只需要简单置为nil, lua会自动删除那些被认为是垃圾的数据;问题就在于,什么对象才是垃圾对象呢?有时候,程序员很清楚的知道某个对象 是垃圾,而lua却无法发现; 比如下面的例子: t =
{}; 执行结果如下:
代码首先创建了一个空表t,接着创建了一个表key1,然后将key1作为t的键,赋值为1,最后将key1置nil; key2表也是一样的操作; 接着程序执行了一次collectgarbage()强制进行一次垃圾回收,此时key1和key2表都被置nil,但是并没有被强制回收, 换句话说,虽然key1本身为nil,但是他先前指向的内容并没有被删除,因为这个内容被保存在了t中; 那么,如果我们希望在将key1置为nil时,他指向的内容就被清空,不管t中是否引用了这个内容,该怎么做? 我们来看如下的代码: t =
{};
以上代码在创建了表t后,立即将t设置为元表,元表里面有一个__mode字段,值为"k",通过运行结果,我们知道 在执行collectgarbage()之前,能够输出t中的元素,但是执行垃圾回收之后,就不能再次输出t中的元素的,这是因为 将表设置为元表后,通过__mode = "k"将其指定为对键的弱引用,也就是说,一旦表中的某个键被垃圾回收,t中会删除 这个键对应的元素;
(1)key值弱引用,也就是刚刚上面提到的那种形式的弱引用,只要其他地方没有对key值得引用,那么table自身 的这个字段也会被删除,设置方法:setmetatable(t, {__mode = "k"}); (2)value值弱引用,类似的,只要其他地方没有对value值得引用,table的这个value所在的字段也会被删除, 设置方法:setmetatable(t, {__mode = "v"}); (3)key和value弱引用,规则一样,只要key或者value中一个在其他地方没有引用,table中对应的字段就被 删除,设置方法:setmetatable(t, {__mode = "kv"});
|
请发表评论