加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 00:27:12 所属栏目:大数据 来源:网络整理
导读:任何人都可以告诉我如何在C中正确使用lua_pop()函数. 当我使用lua_get *()函数时应该调用它?喜欢. lua_getglobal(L,“something”); lua_pop(L,1); 还是怎么用呢?垃圾收集器会在门槛之后清除这些东西吗?谢谢. 解决方法 您调用lua_pop()从Lua堆栈中删除项
任何人都可以告诉我如何在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的最新版本包括一个符号以及每个功能,用于标识消耗的堆栈条目的数量和推送的数量.这有助于避免意外的堆叠增长.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读