Lua C API的垃圾回收探索 (Garbage Collection)

本文探讨了Lua C API中垃圾回收的影响,指出在C层持有Lua对象时可能导致的回收问题,并提出了解决方案,即使用`luaL_ref`将数据存储在表中以保持引用。此外,介绍了Lua的栈管理特性,确保层切换时栈的清洁。还讨论了元方法和`__gc`回调,以及弱表的作用,如内存泄露检测和缓存策略。弱表能提供一种避免内存占用的命名方式,但在实际应用中可能较少见。
摘要由CSDN通过智能技术生成

Lua和C API是通过一个虚拟栈结构lua_State交互的。关于这个虚拟栈,Lua官方手册给的提示并不多。

首先,lua栈上的对象和值是受到GC控制的。因此这样的代码可能存在一些问题:

lua_State* xL=lua_newthread(L);
lua_pop(L,1)
// work with xL...

在这里,lua_newthread执行后,会有一个新thread被放到L上,然后将其返回为xL。此时如果将其从栈上弹出,这个对象虽然在C层上被持有着,但是在Lua层中已经不存在了(消失了),因此GC是有权利进行回收的。这会导致xL变成一个失效变量,以至于程序崩溃。

类似的,如果将一个string放到栈上,然后pop掉,之前lua_tostring返回的字符串指针也有可能因为对象已经被GC而失效。(即使程序仍然运行在C API层)

对于这种情况,如果想在C函数返回之后也能有效的持有变量,又不想设置成全局变量,可以使用luaL_ref将数据存到Registry表中,然后存储返回的int(或者,从Lua角度上讲,reference引用)。用法如下:


                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值