任何人都可以告诉我如何在C++中正确使用lua_pop()函数.
我在使用lua_get*()函数时应该调用它吗?喜欢.
lua_getglobal(L,"something");
lua_pop(L,1);
或者如何使用它?垃圾收集器会在阈值之后清除那些东西吗?谢谢.
您调用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手册的最新版本包括一个符号以及每个函数,用于标识所消耗的堆栈条目数以及推送的数量.这有助于避免意外的堆栈增长.