garbage collection - recolector - ¿Cómo se usa la función lua_pop() correctamente?
qué es el garbagecollector (1)
lua_pop()
a lua_pop()
para eliminar elementos de la pila de Lua. Para funciones simples, esto puede ser completamente innecesario ya que el núcleo limpiará la pila como parte del manejo de los valores devueltos.
Para funciones más complejas, y especialmente para el código C que llama a Lua, a menudo tendrá que sacar elementos de la pila para evitar que la pila crezca indefinidamente.
La función lua_getglobal()
agrega un elemento a la pila cuando se llama, que es nil
si el global no existe o el valor de la variable global nombrada. Tener una copia de ese valor en la pila lo protege del recolector de basura, siempre que esté allí. Ese valor debe permanecer en la pila siempre que lo use el código C que lo recuperó, porque si se modificara el global, la copia en la pila podría ser la única referencia restante.
Entonces, los patrones generales para usar un global son algo como esto:
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;
}
En el último ejemplo, tengo cuidado de copiar el contenido de la cadena porque el puntero devuelto por lua_tostring()
solo tiene validez mientras el valor permanezca en la pila. El requiere que una persona que llama de copyGlobalString()
es responsable de llamar a free()
más tarde.
Tenga en cuenta también que las ediciones recientes del manual de Lua incluyen una notación junto con cada función que identifica el número de entradas de la pila consumidas y el número presionado. Esto ayuda a evitar el crecimiento inesperado de la pila.
¿Alguien puede decirme que cómo usar lua_pop () funciona correctamente en C ++?
¿Debo llamarlo cuando uso una función lua_get * ()? me gusta.
lua_getglobal (L, "algo");
lua_pop (L, 1);
o cómo usarlo? ¿El recolector de basura limpiará esas cosas después del umbral? Gracias.