Lua   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了有关Lua状态关闭和垃圾收集元方法的规则大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
tl; dr version:如果它访问全局变量,在Lua状态关闭期间是垃圾收集元方法安全吗?那么本地的价值呢?

当用lua_close关闭lua_State时,Lua文档说all of the objects are deleted.并且它表示保证调用任何相关的垃圾收集元方法.

大.

但是,有两种可能的GC元方法用例在这种范例下是不确定的:

>如果您的GC元方法使用存储可收集值的局部变量,该怎么办?比方说,一个字符串,一个函数等.也就是说,你的GC元方法定义如下:

local some_String = "String"
function mt:__gc() --[[Do something with some_String]] end

在这种情况下会发生什么?是否可以收集some_String?我知道如果在正常情况下正在收集metatable所在的对象,那么这是不可能的. Lua将保证some_String的值将保留,直到收集GC函数本身.

但是由于lua_close正在破坏所有对象,因此在函数出现之前,GC函数的upval可能会被破坏吗?我认为不是(因为这可能导致各种问题),但我正在寻找真正的答案,而不是我的想法.
>我承认#1不太可能成为问题,因为它会在GC元方法中产生许多问题.但是,这是一个完全不同的问题:

local some_String = "String"
function mt:__gc() print(some_String) end

这看起来像#1,但事实并非如此.为什么?因为它访问全局变量.即,打印.

函数与print中存储的任何值之间没有直接关联(与case 1不同,some_String显然是函数的upvalue).因此,在Lua状态关闭期间调用函数之前可以收集打印.

问题是:在Lua状态关闭期间,垃圾收集元方法是否可以安全使用全局表中的任何内容(忽略故意破坏全局表的可能性,而不是print = nil)?或者,作为一般规则,他们是否应始终明确地将任何功能或数据与本地接触?这足以避免问题吗?

解决方法

可以从__gc方法访问的任何数据都是安全的;这包括本地和可访问的表,如_G,其中包含print.

可能存在的问题是(未加载)C库;这会影响Lua 5.1,并在Lua 5.2.1中得到修复.见patch for “Finalizers may call functions from a dynamic library after the library has been unloaded”.

大佬总结

以上是大佬教程为你收集整理的有关Lua状态关闭和垃圾收集元方法的规则全部内容,希望文章能够帮你解决有关Lua状态关闭和垃圾收集元方法的规则所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。