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

任何人都可以告诉我如何在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);  /* 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的最新版本包括一个符号以及每个功能,用于标识消耗的堆栈条目的数量和推送的数量.这有助于避免意外的堆叠增长.

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...