[Lua]弱引用table
参考链接:
http://www.benmutou.com/archives/1808
一.强引用table
lua中的table是引用类型,更准确地说,是强引用类型。如下第二段代码,在内存中有一个{name = "123"}的table,并用a和b[1]指向它,然后置空a,此时就只剩下b[1]指向它了。这种引用方式和我们所认知的引用是一样的。值得一提的是,这里的a = nil为什么不等同于{name = "123"} = nil呢,意思是将指向的这个表删掉呢?因为lua是具备自动内存管理的,我们只管创建,删除操作是lua自动进行的,因此这里的a = nil并不是删除表,而是指将a对这张表的引用去掉,当没有地方引用这张表时,这张表就会被lua自动清掉。
a = {name = ""}
b = a
a.name = ""
print(b.name)--
a = {name = ""}
b = {}
b[] = a
a = nil
print(b[].name)--
二.弱引用table
如上所说,一般我们创建的table都是强引用table,即key和value都是强引用,强引用可以防止他们指向的对象被回收。如果一个对象存在强引用,那么它就不会被回收。而相对地,就有弱引用,弱引用不能防止对象被回收。如果一个对象只存在弱引用,那么它就会被回收。lua中通过弱引用table来实现弱引用。弱引用table有三种形式:
1.key值弱引用。设置方法为setmetatable(b, {__mode = "k"})
2.value值弱引用。设置方法为setmetatable(b, {__mode = "v"})
3.key和value值弱引用。设置方法为setmetatable(b, {__mode = "kv"})
当一个key或者value被收集时,整个key以及对应的value都会从table中移除。
如下所示,{name = "123"}这个table存在强应用b[1],所以没被回收。
a = {name = ""}
b = {}
b[] = a
a = nil
collectgarbage()
for k,v in pairs(b) do
print(k) --
print(v) --table: 0054E430
end
下面新增一句代码,表示b的value对其指向的对象的引用是弱引用,而b的key对其指向的对象的引用仍然是强引用(对于table来说,其key和value可以指向任何类型的对象,除了key不能指向nil)。{name = "123"}这个table只存在弱应用b[1],所以被回收。
a = {name = ""}
b = {}
setmetatable(b, {__mode = "v"}) --add
b[] = a
a = nil
collectgarbage()
for k,v in pairs(b) do
print(k) --无
print(v) --无
end
[Lua]弱引用table的更多相关文章
- Step By Step(Lua弱引用table)
Step By Step(Lua弱引用table) Lua采用了基于垃圾收集的内存管理机制,因此对于程序员来说,在很多时候内存问题都将不再困扰他们.然而任何垃圾收集器都不是万能的,在有些特殊情况下,垃 ...
- Lua弱引用table
弱引用table 与python等脚本语言类似地,Lua也采用了自动内存管理(Garbage Collection),一个程序只需创建对象,而无需删除对象.通过使用垃圾收集机制,Lua会自动删除过期对 ...
- Chapter 17_1 弱引用table
Lua采用了自动内存管理.所以不用担心新创建的对象需要的内存如何分配出来,也不用考虑对象不再被使用后怎样释放它们所占用的内存. Lua实现了一个增量标记-扫描收集器.它使用这两个数字来控制垃圾收集循环 ...
- Lua table之弱引用
Lua采用了基于垃圾收集的内存管理机制,因此对于程序员来说,在很多时候内存问题都将不再困扰他们.然而任何垃圾收集器都不是万能的,在有些特殊情况下,垃圾收集器是无法准确的判断是否应该将当前对象清理.这样 ...
- lua弱表引用
1.普通垃圾回收 --lua弱表,主要是删除key或者value是table的一种元方法 --元表里的__mode字段包含k或者v:k表示key为弱引用:v表示value为弱引用 local test ...
- lua的弱弱引用表
lua有GC.细节无需太关注.知道些主要的即可,能local就一定不要global: 还有在数组里的对象,除非显式=nil,否则非常难回收: 只是能够用弱引用表来告诉GC. 外部引用为0,就不要管我, ...
- Lua弱表Weak table
定义:弱表的使用就是使用弱引用,很多程度上是对内存的控制. 1.weak表示一个表,它拥有metatable,并且metatable定义了__mode字段. 2.弱引用不会导致对象的引用计数变化.换言 ...
- weak 弱引用的实现方式
来源:冬瓜争做全栈瓜 链接:https://desgard.com/weak/ 对于 runtime 的分析还有很长的路,最近在写 block 系列的同时,也回顾一下之前疏漏的细节知识.这篇文章是关于 ...
- OC对象之旅 weak弱引用实现分析
Runtime学习 -- weak应用源码学习 Runtime源码分析,带你了解OC实现过程.其中参考了大量的大神的代码以及文献,里面也有个人的见解,欢迎拍砖,欢迎交流. 两种常见使用场景 /// ...
随机推荐
- Logback 入门和配置说明
Logback 是 Log4j 的改进版本,而且原生支持 SLF4J,Logback 的初始化步骤如下: 在类路径中查找 logback-test.xml 配置文件 在类路径中查找 logback.g ...
- Could not write to output file 'c:\Windows\Microsoft.NET ASP.NET Files\xx' -- 'Access is denied
网上有IIS7的解决方法,是给"C:\Windows\Temp"文件夹加上添加用户IIS_IUSRS的完全控制权限. 但我这个老机器是IIS6的,没有IIS_IUSERS用户,只能 ...
- Django--bug--__init__() got an unexpected keyword argument 'qnique'
建立模型之后,执行迁移,报如下错误: __init__() got an unexpected keyword argument 'qnique' 错误原因:模型的属性的约束添加错误,这种错误一般就是 ...
- jquery 中prop和 attr
prop就是给html中元素固有的属性赋值 而attr是给元素定义新的属性值.
- ALGO-146_蓝桥杯_算法训练_4-2找公倍数
AC代码: #include <stdio.h> int main(void) { int i; ; i <= ; i ++) { == && i% == ) { p ...
- 阿里云kubernetes被minerd挖矿入侵
阿里云kubernetes被minerd挖矿入侵 # kubectl get rc mysql1 -o yaml apiVersion: v1 kind: ReplicationController ...
- 我的第一个react native
虽然react native出来了很久,但是自己一直因为各种原因没有接触学习,中间尝试过一次,但是因为复杂的环境配置而放弃了.现在,终于因为公司的项目不得不去学习了,当然了,再配置开发环境上面,我还是 ...
- JS之滚动条效果
滚动条在前端页面中是进行见到的,但是在不同的浏览器中,默认的滚动条样式不同,有些浏览器的默认样式也不好更改,因此,我们可以自定义滚动条,接下来就从一个实例开始进入滚动条. 简易进度条 首先要实现的是上 ...
- mysql查询优化之四:优化特定类型的查询
本文将介绍如何优化特定类型的查询. 1.优化count()查询count()聚合函数,以及如何优化使用了该函数的查询,很可能是mysql中最容易被误解的前10个话题之一 count() 是一个特殊的函 ...
- 方法 - ShellCode测试
机器码->汇编 1 // ShellCode测试.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windo ...