【问题标题】:lua memory managementlua内存管理
【发布时间】:2010-11-17 07:36:21
【问题描述】:

我们如何释放 lua 堆栈?

【问题讨论】:

  • 为什么投反对票?这绝对是与编程相关的,我不认为所使用的语言有任何问题。
  • 你想达到什么目的?

标签: lua


【解决方案1】:

你为什么要这样做?

如果你需要移除 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_settop(L, 0)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我想你需要lua_remove?我只是浏览了手册,不确定是否有“清除整个堆栈”功能。

    void lua_remove (lua_State *L, int index);

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果你放了例如堆栈中不再需要的 5 个元素,可以使用 lua_pop 删除它们:

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

        否则,您可能想要使用 lua_settop 或 lua_remove,如已建议的那样。

        由于 Lua 是自动进行垃圾收集的,实际占用的内存需要一段时间才能释放,所以如果你想立即删除它,你需要显式调用垃圾收集器。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            如果您使用表或数组作为变量存储,您可以通过这样做将键设置为 nil

            a[variable key]=nil
            

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

            【讨论】:

              猜你喜欢
              • 2012-08-27
              • 2021-06-10
              • 1970-01-01
              • 1970-01-01
              • 2011-07-21
              • 2012-03-21
              相关资源
              最近更新 更多