gpt4 book ai didi

c++ - 控制Lua5.1的垃圾收集器

转载 作者:行者123 更新时间:2023-11-30 04:40:44 25 4
gpt4 key购买 nike

好的,我有一个使用 SWIG 暴露给 Lua 的 C++ 类。该脚本创建对象,但管理器类也有一个指向该对象的指针,因此可以出于任何原因在 C++(或其他脚本)中对其进行修改。

问题是当脚本完成时对象被释放,我如何控制垃圾收集器收集什么而不用实现 gc 元方法?

这是一个例子:

--Script that creates the object
someObject = Utils.Object("Obj name");

现在对象已经向管理器注册了自己,所以应用程序的其余部分(和其他脚本)可以访问它。

--Another script
obj = ObjManager:GetObject(0);

显然这不是一个非常现实的例子,但希望它能说明我的问题。在 C++ 中有没有 gc 元方法否决垃圾收集器的方法?

只是为了澄清管理器是在 C++ 中,而 Utils 是包含公开类的模块名称。此外,对象在其构造函数中将自身注册到管理器。

提前致谢。

最佳答案

Lua 的 GC 只知道 Lua 内部持有的引用,这是一个合理的实现约束。这意味着对象的生命周期在 Lua 的控制之下。如果通过执行一个脚本或函数创建的对象需要对以后的脚本或函数可用,则必须在 Lua 状态中保留对它的引用,以便 GC 知道它仍在使用中。否则与垃圾无异,随时可能被丢弃。

这是 Lua 注册表的用途之一。 C 端可以很容易地保存对任何 Lua 对象的引用,方法是将它放在注册表中。键可以是 C 库已知的某个唯一值(转换为轻型用户数据的 static 变量的地址通常是一个不错的选择,因为它不会与任何其他库中的任何键冲突)。或者,函数调用 luaL_ref(L, LUA_REGISTRYINDEX) 会将项目放在注册表的堆栈顶部,并返回一个唯一的整数键。这对于存储脚本提供的回调函数非常有效,既可以保护该函数免受 GC 的影响,又可以将指向它的“指针”(整数键)存储在 C 结构中,以便可以检索和调用它稍后。

请注意,luaL_ref() 可用于管理任何表中的引用,因此使用您的模块私有(private)的表而不是全局注册表可能非常有意义 table 。在这种情况下,表 ObjManager 本身可能是一个不错的选择。

关于c++ - 控制Lua5.1的垃圾收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/833257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com