任何人都可以告诉我如何在C ++中正确使用lua_pop()函数。
我在使用lua_get *()函数时应该调用它吗?等。
lua_getglobal(L,“某事”);
lua_pop(L,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的最新版本包含一个符号以及每个函数,用于标识所消耗的堆栈条目数以及推送的数量。这有助于避免意外的堆栈增长。