我们如何释放Lua栈?
为什么要这样做?
如果需要移除Lua栈中的所有元素,应该调用lua_settop(L, 0)
。引自手册:
void lua_settop (lua_State *L, int index);
接受任何可接受的索引或0,并将堆栈顶部设置为此索引。如果新的顶部大于旧的顶部,则新元素将填充为nil。如果索引为0,则会删除所有堆栈元素。
这将使堆栈中的所有元素都成为垃圾收集的对象。然后调用lua_gc(LUA_GC_COLLECT)
进行垃圾收集。如果您确实需要收集所有可收集的垃圾,请在循环中调用它,直到lua_gc(LUA_GCCOUNT)
返回的值保持不变。
请注意,(据我所知)您不能释放为堆栈本身分配的空间 — 除非您调用lua_close()
。
基本上,我所知道的唯一释放整个Lua堆栈的方法是在lua_State实例上调用lua_close。
lua_remove
函数?我刚刚浏览了一下手册,不确定是否有“清除整个堆栈”的功能。
void lua_remove(lua_State *L, int index);
删除给定有效索引处的元素,并将上面的元素向下移动以填补空缺。不能使用伪索引进行调用,因为伪索引不是实际的堆栈位置。
lua_settop(L, 0);
应该可以工作。
然后调用 lua_gc()。这不会释放所有空间,
在关闭 lua 状态时,整个堆栈将被清除。
a[variable key]=nil
我读到过,如果你调用一个不存在于表/数组中的键,它会返回nil。nil是一种没有数据、变量或状态的状态。我一直认为这样会删除或清除键中的数据。
如果您已经将5个元素放入堆栈中,而现在不再需要它们,您可以使用lua_pop将它们移除:
lua_pop(l, 5) -- removes the 5 topmost elements from the stack