我们如何释放lua堆栈?
答案 0 :(得分:15)
你为什么要这样做?
如果你需要删除Lua堆栈中的所有元素,你应该调用lua_settop(L, 0)
。引用manual:
void lua_settop (lua_State *L, int index);
接受任何可接受的索引,或0,并将堆栈顶部设置为此索引。如果新顶部大于旧顶部,则新元素将填充为nil。如果index为0,则删除所有堆栈元素。
这会使堆栈中的所有元素都被垃圾收集。之后调用lua_gc(LUA_GC_COLLECT)
进行垃圾回收。如果你真的需要收集所有可收集的垃圾,请在循环中调用它,直到lua_gc(LUA_GCCOUNT)
返回的值保持不变。
请注意,(AFAIK)您无法释放为堆栈本身分配的空间 - 当然,除非您致电lua_close()
。
答案 1 :(得分:3)
基本上,我知道释放整个lua堆栈的唯一方法是在lua_State实例上调用lua_close。
答案 2 :(得分:2)
我认为你需要lua_remove
?我只是浏览了手册,不确定是否有“清除整个堆栈”功能。
void lua_remove (lua_State *L, int index);
移除给定有效索引处的元素,向下移动此索引上方的元素以填补空白。无法使用伪索引调用,因为伪索引不是实际的堆栈位置。
答案 3 :(得分:1)
lua_settop(L, 0);
应该有效。
然后调用lua_gc()。这不会释放所有空间,
当你关闭lua状态时,整个堆栈将被清除。
答案 4 :(得分:0)
如果你放了例如您不再需要的堆栈中有5个元素,您可以使用lua_pop删除它们:
lua_pop(l, 5) -- removes the 5 topmost elements from the stack
否则,您可能希望使用已建议的lua_settop或lua_remove。
由于Lua自动被垃圾收集,实际占用的内存将需要一段时间才能被释放,因此如果你想立即删除它,你需要明确地调用垃圾收集器。
答案 5 :(得分:0)
在某些情况下,您不必这样做。例如,在函数中,您可以推送5个值,然后返回3,表示您返回3个值。额外的2个值将自动释放,因为堆栈大小会根据您的说法进行调整。 (这可以避免在您说您返回的值不同于实际推送的值时出现的错误。)
答案 6 :(得分:0)
如果您使用表或数组作为变量存储,则可以通过执行
将键设置为nila[variable key]=nil
我读过如果你调用一个表/数组中不存在的键,它将返回nil,nil是一个没有数据,变量或状态的状态,我一直认为它是以某种方式删除或者清除密钥中的数据