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