如何正确使用调用lua_pop()函数?(How to use lua_pop() function

2019-06-27 13:09发布

任何人都可以请告诉我如何在C正确使用调用lua_pop()函数++。

  • 我应该把它当我使用lua_get *()函数? 喜欢。

    lua_getglobal(L, “东西”);

    调用lua_pop(L,1);

或如何使用它? 将垃圾收集器的阈值之后清除这些东西吗? 谢谢。

Answer 1:

你叫lua_pop()从Lua的堆栈中删除的项目。 对于简单的功能,这可以是完全不必要的,因为该芯将清理堆栈作为处理的返回值的一部分。

对于更复杂的功能,尤其是对C代码被调用到Lua中,你会经常需要从栈中弹出的东西,以防止堆栈无限制地增长。

所述lua_getglobal()函数将一个项目时调用堆栈,其是nil ,如果全球不存在或已命名的全局变量的值。 具有价值的堆栈上的副本,只要是有利于垃圾收集保护它。 该值需要,只要它是通过检索它,因为如果全球进行了修改,在栈上的副本可能是剩下的唯一参考的C代码使用留在堆栈中。

因此,对于使用全局的总体模式是类似这些:

void doMyEvent(lua_State *L) {
    lua_getglobal(L, "MyEvent");
    lua_call(L, 0, 0);  /* pops the function and 0 parameters, pushes 0 results */
}

double getGlobalDouble(lua_State *L, const char *name) {
    double d;
    lua_getglobal(L,name);
    d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */
    lua_pop(L,1);          /* pop the value to leave stack balanced */
    return d;
}

char *copyGlobalString(lua_State *L, const char *name) {
    char *s = NULL;
    lua_getglobal(L,name);
    if (!lua_isnil(L,-1))
        s = strdup(lua_tostring(L,-1));
    lua_pop(L,1);
    return s;
}

在最后一个例子,我很小心,因为返回的字符串指针的内容复制lua_tostring()的值保持在栈上只保证长达有效。 该要求的呼叫者copyGlobalString()负责调用free()后面。

还要注意的是最近的版本的Lua手册包括与每个标识消耗堆栈的条目数函数一起的符号,并推数。 这有助于避免意外的堆栈增长。



文章来源: How to use lua_pop() function correctly?