lua内存管理

时间:2009-08-06 11:02:42

标签: lua

我们如何释放lua堆栈?

7 个答案:

答案 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)

如果您使用表或数组作为变量存储,则可以通过执行

将键设置为nil
a[variable key]=nil

我读过如果你调用一个表/数组中不存在的键,它将返回nil,nil是一个没有数据,变量或状态的状态,我一直认为它是以某种方式删除或者清除密钥中的数据