[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自动清掉。

1 a = {name = "123"}
2 b = a
3 a.name = "456"
4 print(b.name)--456

1 a = {name = "123"}
2 b = {}
3 b[1] = a
4 a = nil
5 print(b[1].name)--123

二.弱引用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],所以没被回收。

1 a = {name = "123"}
2 b = {}
3 b[1] = a
4 a = nil
5 collectgarbage()
6 for k,v in pairs(b) do
7     print(k) --1
8     print(v) --table: 0054E430
9 end

下面新增一句代码,表示b的value对其指向的对象的引用是弱引用,而b的key对其指向的对象的引用仍然是强引用(对于table来说,其key和value可以指向任何类型的对象,除了key不能指向nil)。{name = "123"}这个table只存在弱应用b[1],所以被回收。

 1 a = {name = "123"}
 2 b = {}
 3 setmetatable(b, {__mode = "v"}) --add
 4 b[1] = a
 5 a = nil
 6 collectgarbage()
 7 for k,v in pairs(b) do
 8     print(k) --无
 9     print(v) --无
10 end

posted on 2017-12-09 14:43 艰苦奋斗中 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lyh916/p/7899815.html

[Lua]弱引用table相关推荐

  1. lua之弱引用table

    Lua之弱引用table 核心原理:lua的弱引用不增加引用计数 这篇文章主要介绍了Lua教程之弱引用table,本文讲解了自动内存管理的缺陷.弱引用table.三种形式的弱引用等内容,需要的朋友可以 ...

  2. Lua弱引用表处理普通的内存泄漏

    Lua中有垃圾回收机制(GC)的,支持GC的对象有五种string,table,function,full userdata,thread,理论上不会有内存泄漏,但是进行GC时,如果这个对象还有引用, ...

  3. Lua:深拷贝与浅拷贝,强引用与弱引用

    概述: 浅拷贝:tabB = tabA ,相当于是对象起别名,或者说赋值指针,tabA的任何改动也会实装在tabB上: 深拷贝:tabC = DeepCopy(tabA).,遍历k,v在tabA创建. ...

  4. ThreadLocalMap的enrty的key为什么要设置成弱引用

    ThreadLocal如何回收value,什么时候回收?(学习笔记) https://www.cnblogs.com/1693977889zz/p/11111568.html 1)ThreadLoca ...

  5. 弱引用什么时候被回收_ThreadLocal的内存泄露?什么原因?如何避免?

    前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...

  6. iOS之深入解析内存管理散列表SideTables和弱引用表weak_table的底层原理

    一.SideTables 和 weak_table 的关系 在 runtime 中,有四个数据结构非常重要,分别是 SideTables,SideTable,weak_table_t 和 weak_e ...

  7. .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 )...

    如果你使用过 WPF/UWP 等 XAML UI 框架,那么应该了解到附加属性的概念.那么没有依赖属性支持的时候如何做附加属性的功能呢?你可能会想到弱引用.但这需要做一个弱引用字典,要写的代码还是非常 ...

  8. Android-JNI开发系列《五》局部引用全局引用全局弱引用缓存策略

    人间观察 好像什么都来得及,又好像什么都来不及. 本篇文章主要介绍在jni开发中常见的三种引用的使用方法和注意事项以及jni和java交互的缓存策略. 我们知道Java是一门纯面象对象的语言,除了基本 ...

  9. 一文讲透java弱引用以及使用场景

    文章目录 概念 深入原理 应用案例解析 概念 大部分情况下我们看到是强引用,比如下面这一行: String str1 = new String("abc"); 变量str1被用来存 ...

最新文章

  1. 前端面试http和https的区别
  2. async await异步发送请求例子
  3. CSS 基础:文本和字体(4)思维导图
  4. [笔记].Nios II 软核性能基准
  5. 资源 | 有没有必要把机器学习算法自己实现一遍?
  6. C语言程序设计学习心得体会总结
  7. 【转载】C# 开源库大全非常好
  8. 【图像处理】高斯滤波
  9. stap监控cpu脚本小结
  10. lc用U盘更新固件_索尼电视安卓8.0固件升级完后电视连不上WIFI?最新解决方法!...
  11. Markdown中如何实现内容折叠操作
  12. ES-JOB——分布式定时任务高级使用——控制台修改任务
  13. 菜鸟笔记-微信分享突然失效的解决
  14. (三十一:2021.01.12)MICCAI 2018 追踪之论文纲要(下)
  15. mac safari无法打开网页_苹果手机浏览器打不开网页怎么办?Safari无法打开网页的解决方法...
  16. 我的微信被限制使用了!
  17. 使用async批量获取博客链接
  18. 类似360的轨迹加密功能
  19. IT男真实的情感记录
  20. pca降维python实例_主成分分析(Principal component analysis, PCA)例子–Python | 文艺数学君...

热门文章

  1. k8s节点亲和性:pod和node的亲和性、硬策略、软策略
  2. zookeeper 分布式协调服务
  3. Redis命令:SETNX key value(SET if Not eXists)
  4. nginx tomcat集群实现session共享
  5. Java面向对象之构造方法
  6. 多媒体计算机探索 教案,多媒体的教学设计
  7. 增加mysql的最大连接数
  8. Java一种错误的实例化方法:在默认无参构造函数中进行实例化
  9. 回溯算法(八皇后问题)
  10. linux 专家认证,ONAP专家认证 (COP)