说我有一个类似
的脚本my_global = my_cpp_class()
my_global = nil
现在正确调用my_cpp_class的析构函数时,此代码不会:
my_global = my_cpp_class()
call_script("a.lua") -- a.lua contains "my_global = nil"
-- "call_script" is actually a simplified notation
-- I create script as userdata and then I can
-- set its child scripts that should be reloaded once script is modified
当我简单地将call_script替换为dofile时也一样。
基本上,我希望特定的脚本文件能够将“nil”分配给现有的全局,以便旧值变为无法访问。
现在我需要的是实时脚本重新加载 - 每当脚本文件被修改时,它立即被编译并在运行时使用其子脚本再次使用call_script
进行调用,因此它应该导致全局重新分配因此旧的价值应该是垃圾收集。
是否有更简单,更首选的方式来执行此类脚本重新加载?
我应该以某种方式使用本地人,还是在环境中操纵? 我使用luabind,如果它是相关的。
答案 0 :(得分:2)
如果您在同一lua_State
内执行脚本,则实际全局被重新分配(您可以在分配nil
之前检查该变量是否可见)。收集对象时会运行C ++对象的析构函数,这可能不会在无法访问后立即发生。从C ++调用lua_gc()
或从Lua调用collectgarbage()
可能会有所帮助。