|
On 16/09/2010 18:58, jgiors@threeeyessoftware.com wrote:
Sure, I overlooked it when I typed the code. The point is, given t will be available for garbage collection, will the GC collect get_t.lua's script from memory? I could say yes from your post, but you didn't say it out loud.-------- Original Message -------- Subject: Re: Lua GC From:<jgiors@threeeyessoftware.com> Date: Thu, September 16, 2010 2:49 pm To: lua-l@lists.lua.orgAndre Leiradella<andre@leiradella.com> wrote:Hi All, Given the following script held in a get_t.lua file: ----------8<---------- local t = { -- Initialization of fields in t. } -- Code that manipulates fields in t. return t ----------8<---------- and the following main.lua file: ----------8<---------- local t = loadfile( 'get_t.lua' )() -- Use t. -- Code that runs for a long time and that doesn't -- reference t anymore follows... ----------8<---------- Can I count on t being garbage-collected, and also the bytecode generated by loading get_t.lua along with all local variables and functions declared in it? Consider that main.lua will be creating tables, strings and userdata so the GC will be triggered eventually. I'm aware of require and stuff but since the results of get_t.lua will be used just once I don't want it to be lying around while main.lua runs. Thanks, AndreTable t will not be garbage-collected (unless there is some optimizer magic I don't know about). t is in scope throughout the main file, and will not be dereferenced until main.lua terminates.
Thanks, Andre
However, there is a very simple solution. Just change your main.lua to this: ----------8<---------- local t = loadfile( 'get_t.lua' )() -- Use t. t = nil --This will dereference t. --You could also call collectgarbage("collect") -- Code that runs for a long time and that doesn't -- reference t anymore follows... ----------8<---------- An alternative is to package the operations on t into a function, which I find "cleaner" (please excuse any typos!): ----------8<---------- local function init() local t = loadfile( 'get_t.lua' )() --Use t. --optional collectgarbage("collect") end init() --Rest of main. t is not in scope. ----------8<----------I made a mistake in that second version, it should be: ----------8<---------- local function init() local t = loadfile( 'get_t.lua' )() --Use t. end init() --optional collectgarbage("collect") --GC HERE, NOT IN INIT() --Rest of main. t is not in scope. ----------8<---------- Sorry for any potential confusion. John Giors Independent Programmer Three Eyes Software jgiors@ThreeEyesSoftware.com http://www.ThreeEyesSoftware.com