Lua 内存管理

我们如何在 Lua 中释放堆栈?

原文链接 https://stackoverflow.com/questions/1238230

点赞
stackoverflow用户126042
stackoverflow用户126042

我觉得你需要 lua_remove 函数?我只是快速浏览了一下手册,不确定是否有“清除整个栈”的函数。

void lua_remove(lua_State *L, int index);

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

2009-08-06 11:10:25
stackoverflow用户123623
stackoverflow用户123623

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

2009-08-06 11:16:00
stackoverflow用户6236
stackoverflow用户6236

为什么要这么做?

如果你需要移除 Lua 栈中的所有元素,你应该调用 lua_settop(L, 0)。引用手册

void lua_settop (lua_State *L, int index);

接受任何可接受的索引或 0,并将栈顶设置为该索引。如果新的栈顶比旧的大,则新元素将被填充为 nil。如果 index 为 0,则所有栈元素都将被移除。

这将导致栈中的所有元素被垃圾回收。之后调用 lua_gc(LUA_GC_COLLECT) 进行垃圾回收。如果您确实需要收集所有可收集的垃圾,请在一个循环中调用它,直到 lua_gc(LUA_GCCOUNT) 返回的值保持不变。

请注意(在我所知道的情况下),您无法释放为堆栈本身分配的空间 - 除非您调用 lua_close()

2009-08-06 16:04:20
stackoverflow用户1204141
stackoverflow用户1204141

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

lua_pop(l, 5) -- 从堆栈中移除最上面的 5 个元素

否则,您可能想使用lua_settop或建议中提到的lua_remove。

由于 Lua 具有自动垃圾回收功能,实际占用的内存将需要一段时间才能被释放,因此,如果您想立即将其删除,您需要显式地调用垃圾回收器。

2012-04-22 13:42:11
stackoverflow用户798374
stackoverflow用户798374

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

2012-08-29 14:20:32
stackoverflow用户4660461
stackoverflow用户4660461

如果您使用表格或数组作为变量存储,您可以通过以下方式将键设置为 nil:

a[variable key]=nil

我读到,如果您调用表格/数组中不存在的键,则会返回 nil,nil 是一个没有数据、变量或状态的状态,我一直认为它在某种程度上删除或清除了键中的数据。

2015-03-12 18:07:47
stackoverflow用户6889435
stackoverflow用户6889435

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

2016-09-27 17:35:07