【发布时间】:2010-11-17 07:36:21
【问题描述】:
我们如何释放 lua 堆栈?
【问题讨论】:
-
为什么投反对票?这绝对是与编程相关的,我不认为所使用的语言有任何问题。
-
你想达到什么目的?
标签: lua
我们如何释放 lua 堆栈?
【问题讨论】:
标签: lua
你为什么要这样做?
如果你需要移除 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()。
【讨论】:
基本上,我知道释放整个 lua 堆栈的唯一方法是在 lua_State 实例上调用 lua_close。
【讨论】:
我想你需要lua_remove?我只是浏览了手册,不确定是否有“清除整个堆栈”功能。
void lua_remove (lua_State *L, int index);删除给定有效索引处的元素,向下移动该索引上方的元素以填补空白。不能用伪索引调用,因为伪索引不是实际的堆栈位置。
【讨论】:
lua_settop(L, 0); 应该可以工作。
然后调用 lua_gc()。这不会释放所有空间,
当您关闭 lua 状态时,整个堆栈将被清除。
【讨论】:
如果你放了例如堆栈中不再需要的 5 个元素,可以使用 lua_pop 删除它们:
lua_pop(l, 5) -- removes the 5 topmost elements from the stack
否则,您可能想要使用 lua_settop 或 lua_remove,如已建议的那样。
由于 Lua 是自动进行垃圾收集的,实际占用的内存需要一段时间才能释放,所以如果你想立即删除它,你需要显式调用垃圾收集器。
【讨论】:
在某些情况下,您不必这样做。例如,在一个函数中,您可能会推送 5 个值,然后返回 3,表示您正在返回 3 个值。额外的 2 个值将被自动释放,因为堆栈大小已调整为您所说的。 (这可以避免您说返回的值与实际推送的值不同的错误。)
【讨论】:
如果您使用表或数组作为变量存储,您可以通过这样做将键设置为 nil
a[variable key]=nil
我读到,如果您调用表/数组中不存在的键,它将返回 nil,nil 是没有数据、变量或状态的状态,我一直认为它在某种程度上删除或清除key中的数据
【讨论】: