Lua内存管理

9
我们如何释放Lua栈?

3
为什么会被踩?这明显和编程有关,我也没看出语言使用或其他方面存在问题。 - R. Martinho Fernandes
你想要实现什么目标? - lhf
7个回答

15

为什么要这样做?

如果需要移除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_settop(L, 0)。 - Watusimoto

3

基本上,我所知道的唯一释放整个Lua堆栈的方法是在lua_State实例上调用lua_close。


2
我认为您需要使用lua_remove函数?我刚刚浏览了一下手册,不确定是否有“清除整个堆栈”的功能。

void lua_remove(lua_State *L, int index);

删除给定有效索引处的元素,并将上面的元素向下移动以填补空缺。不能使用伪索引进行调用,因为伪索引不是实际的堆栈位置。


1

lua_settop(L, 0); 应该可以工作。 然后调用 lua_gc()。这不会释放所有空间, 在关闭 lua 状态时,整个堆栈将被清除。


0
如果您正在使用表格或数组作为变量存储,您可以通过执行以下操作将键设置为nil。
a[variable key]=nil

我读到过,如果你调用一个不存在于表/数组中的键,它会返回nil。nil是一种没有数据、变量或状态的状态。我一直认为这样会删除或清除键中的数据。


0

如果您已经将5个元素放入堆栈中,而现在不再需要它们,您可以使用lua_pop将它们移除:

lua_pop(l, 5) -- removes the 5 topmost elements from the stack

否则,您可能想使用已经建议的lua_settop或lua_remove。
由于Lua是自动垃圾回收的,实际占用的内存需要一段时间才能被释放,因此如果您想立即将其删除,需要显式调用垃圾回收器。

0
在某些情况下,您不必这样做。例如,在函数中,您可能会推送5个值,然后返回3个值,以表示您正在返回3个值。额外的2个值将自动释放,因为堆栈大小已调整为您所说的大小。(这可以避免您说您正在返回与实际推送的值不同数量的值的错误。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接