当前位置 : 主页 > 网络编程 > lua >

垃圾收集 – 如何正确使用lua_pop()函数?

来源:互联网 收集:自由互联 发布时间:2021-06-23
任何人都可以告诉我如何在C中正确使用lua_pop()函数. 当我使用lua_get *()函数时应该调用它?喜欢. lua_getglobal(L,“something”); lua_pop(L,1); 还是怎么用呢?垃圾收集器会在门槛之后清除这些东
任何人都可以告诉我如何在C中正确使用lua_pop()函数.

当我使用lua_get *()函数时应该调用它?喜欢.

lua_getglobal(L,“something”);

lua_pop(L,1);

还是怎么用呢?垃圾收集器会在门槛之后清除这些东西吗?谢谢.

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

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

lua_getglobal()函数在调用时将一个项目添加到堆栈,如果全局不存在,则为null,或者是全局变量的值.在堆栈上复制该值后,只要它在那里就保护它免受垃圾回收器的影响.只要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的最新版本包括一个符号以及每个功能,用于标识消耗的堆栈条目的数量和推送的数量.这有助于避免意外的堆叠增长.

网友评论