当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何正确使用lua_pop()函数?》经验,为你挑选了1个好方法。

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

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

lua_getglobal(L,"something");

lua_pop(L,1);

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



1> RBerteig..:

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

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有