Eri*_*ius 5 c++ lua allocation object-lifetime luabind
假设我有这样一个类:
class A
{
public:
A(){}
~A(){}
};
Run Code Online (Sandbox Code Playgroud)
并通过Luabind将它暴露给Lua,如下所示:
module(luaState)
[
class_<A>("Foo")
.def(constructor<>())
];
Run Code Online (Sandbox Code Playgroud)
最后在这样的脚本中实例化它:
A = Foo();
Run Code Online (Sandbox Code Playgroud)
那时A的实际"存在状态"是什么?
它是在堆中的某个地方,并且lua在某处保留了对它的引用?(或luabind ::对象?)
我觉得它只能是一个指针,如新的或同等的.
但是,我可以将函数绑定到接受引用的lua,例如lua_doSomething(A & a),最终会有一个实际的引用.诚然,我知道这很可能只是路过被luabind a的*a,但我不知道如果这是怎么回事了.
我问这个的原因是为了更好地理解和预测在脚本中实例化的对象的生命周期.
那个,我不确定所有权或生命周期是否会改变,如果不是像上面那样将类暴露给lua,我这样做:
A * lua_CreateA()
{
return new A();
}
module(luaState)
[
class_<A>("Foo")
];
module(luaState)
[
def("createA",&lua_CreateA)
];
Run Code Online (Sandbox Code Playgroud)
并使用它像
A = createA();
Run Code Online (Sandbox Code Playgroud)
根据我到目前为止所理解的逻辑,这个案例需要我进行清理,因为我是分配一个新对象的人,除非为luabind这样的赋值与使用绑定构造函数这样做.
简而言之,我真的很困惑对象的生命周期和这里的东西...我搜索与此相关的关键字,但我只是得到像http://www.gamedev.net/topic/525692-luabind这样的东西 -ownership和-破坏/
这不是我想知道的.我想了解在幕后处理有关分配,实例化,生命周期和所有这些事情的具体方法.
使用Luabind,对象的生命周期非常简单.你不需要了解Luabind在内部做什么的血腥细节.
Lua中拥有所创建的对象的 Lua的直接.因此,如果在Lua中使用构造函数语法分配对象,则该对象由Lua拥有.当Lua中不再引用该对象时,Lua GC将收集它.
如果Lua中获得通过任何其他方式对一个对象的引用,那么Lua中不拥有该对象,除非您特别使用Luabind的采取政策转移所有权.因此,如果要绑定一个将对象返回给Lua的函数,这样您现在可以期望Lua决定该对象何时处于活动状态,那么您需要使用adopt策略.
最后一段仅适用于实际引用(返回指针和引用类型).如果给Lua 一个对象的副本(通过非引用或指针返回值),那么Lua将拥有该对象的副本.