2011-08-14 10 views
5

Digamos que tengo una clase como esta:necesita ayuda para entender cómo luabind instancia clases

class A 
{ 
public: 
A(){} 
~A(){} 
}; 

y exponerla a Lua través Luabind así:

module(luaState) 
    [ 
     class_<A>("Foo") 
     .def(constructor<>()) 
    ]; 

Y por último una instancia en un script como este:

A = Foo(); 

¿Cuál es el 'estado de existencia' real de A en ese punto?

¿Está en algún lugar en el montón, y lua guarda una referencia en algún lugar? (o un luabind :: objeto?)

Tengo la sensación de que solo puede ser un puntero, como en, asignado por nuevo o equivalente.

Sin embargo, puedo vincular funciones a lua que acepten referencias, como lua_doSomething(A & a) y lo que termine allí será una referencia real. De acuerdo, sé que esto podría muy bien simplemente ser luabind pasando a como , pero no tengo idea de si así es como sucede.

La razón por la que estoy preguntando esto es para comprender y predecir un poco mejor la vida útil de los objetos instanciados en un script.

Eso, y que yo esté seguro si titularidades o vidas cambian si, en lugar de exponer a la clase a la LUA como la de arriba, lo hago de esta manera:

A * lua_CreateA() 
{ 
return new A(); 
} 

module(luaState) 
    [ 
     class_<A>("Foo") 
    ]; 


module(luaState) 
    [ 

    def("createA",&lua_CreateA) 

    ]; 

Y su uso como

A = createA(); 

Por la lógica que entiendo hasta ahora, este caso me obligaría a hacer la limpieza ya que soy el que asigna un nuevo objeto, a menos que una tarea como esta para luabind sea lo mismo que hacerla con el constructor encuadernado.

En resumen, estoy realmente confundido acerca de duración de los objetos y cosas por aquí ... Busqué en Google para las palabras clave relacionadas con esto, pero yo sólo estoy haciendo cosas por el estilo http://www.gamedev.net/topic/525692-luabind-ownership-and-destruction/

Lo cual no es realmente lo que quiero saber Quiero entender la forma concreta de cómo se manejan las cosas detrás de escena con respecto a la asignación, instanciación, vida y todo eso.

Respuesta

5

La duración del objeto es muy simple con Luabind. No necesita comprender los detalles sangrientos de lo que Luabind hace internamente para obtenerlo.

Lua posee los objetos que se crean por Lua directamente. Entonces, si asigna un objeto con sintaxis de constructor en Lua, ese objeto es propiedad de Lua. Cuando el objeto ya no se referencia en Lua, el Lua GC lo recogerá.

Si Lua obtiene una referencia a un objeto por cualquier otro medio, entonces Lua hace no posee ese objeto a menos que transfiera específicamente la propiedad utilizando la política de adopción de Luabind. Por lo tanto, si está vinculando una función que devuelve un objeto a Lua, de modo que ahora espera que Lua decida cuándo ese objeto está vivo o no, debe utilizar la política de adopción.

El último párrafo solo se aplica a las referencias reales (devolución de punteros y tipos de referencia). Si a Lua se le da una copia de un objeto (a través de un valor de retorno sin referencia o puntero), entonces Lua será el propietario de esa copia del objeto.

Cuestiones relacionadas