如何正确使用lua_pop()函数?

时间:2009-08-01 20:31:32

标签: garbage-collection lua

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

  • 我在使用lua_get *()函数时应该调用它吗?等。

    lua_getglobal(L,“某事”);

    lua_pop(L,1);

或如何使用它?垃圾收集器会在阈值之后清除那些东西吗?感谢。

1 个答案:

答案 0 :(得分:20)

您调用lua_pop()以从Lua堆栈中删除项目。对于简单的函数,这可能是完全不必要的,因为核心将清理堆栈作为处理返回值的一部分。

对于更复杂的函数,特别是对于调用Lua的C代码,通常需要从堆栈弹出东西以防止堆栈无限增长。

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 manual的最新版本包含一个符号以及每个函数,用于标识所消耗的堆栈条目数以及推送的数量。这有助于避免意外的堆栈增长。