1

我有一个很长时间的飞行程序,它是一个播放器。启动后,它将通过服务器的命令从网络加载并运行 Lua 代码。每个代码都有一个唯一的命名模块。

每天,它都需要加载一系列不同的代码(即 Lua 模块)并运行它们。我担心时间长了内存会溢出...

所以,我的问题是:Lua 模块可以删除吗?不再使用的模块我想放弃它。

4

2 回答 2

2

Lua 中的模块只是一个包含所有函数和变量的表。如果将其设置为 nil 并删除 package.loaded 中的条目,则垃圾收集器应将其清理。

这是一个实现模块卸载的功能:http: //lua-users.org/lists/lua-l/2009-03/msg00587.html

于 2013-08-07T07:43:04.333 回答
2

对于用 Lua 编写的模块,将条目设置package.loaded为 nil 可能会起作用。但是,它是一种 hack,不应该用于任意模块(尤其是 C 模块)

来自 LuaJIT 的开发者 Mike Pall:

实际上,没有安全的方法可以卸载任意模块,即使是普通的 Lua。C 模块可能相互依赖,并且以错误的顺序卸载它们会造成严重破坏。如果仍然有一个带有 __gc C 函数的用户数据,并且您使用上述方法从地址空间中删除了共享库......猜猜会发生什么。

来源

对于您的情况,请考虑不使用moduleand require,而是制作您自己的更简单的系统,该系统利用以下功能loadstring

于 2013-08-07T17:36:31.607 回答