假设我有一个这样的类(class):
class A
{
public:
A(){}
~A(){}
};
然后通过Luabind将其暴露给Lua:
module(luaState)
[
class_<A>("Foo")
.def(constructor<>())
];
最后在这样的脚本中实例化它:
A = Foo();
那时A的实际“存在状态”是什么?
它在堆中的某处,而lua在某处引用了它吗?
(或luabind::object?)
我感觉它只能是一个指针,例如,由new或等效对象分配。
但是,我可以将函数绑定(bind)到接受引用的lua,例如
lua_doSomething(A & a)
,最终会得到一个实际的引用。当然,我知道这很可能只是通过将
a
作为*a
传递给luabind,但是我不知道那是怎么回事。我问这个的原因是为了更好地理解和预测脚本中实例化的对象的生命周期。
那,我不确定所有权或生命周期是否会改变,而不是像上面那样将类暴露给lua,而是这样做:
A * lua_CreateA()
{
return new A();
}
module(luaState)
[
class_<A>("Foo")
];
module(luaState)
[
def("createA",&lua_CreateA)
];
并像这样使用
A = createA();
根据我到目前为止所了解的逻辑,这种情况将要求我进行清理,因为我是分配新对象的对象,除非为luabind这样的分配与使用绑定(bind)构造函数进行分配相同。
简而言之,我对对象的生存期和这里的东西真的很困惑。
我用谷歌搜索了与此相关的关键字,但我只得到类似
http://www.gamedev.net/topic/525692-luabind-ownership-and-destruction/
这不是我真正想知道的。
我想了解在幕后如何处理有关分配,实例化,生存期以及所有这些内容的具体方式。
最佳答案
使用Luabind,对象生存期非常简单。您不需要了解Luabind在内部所做的事的细节。
Lua拥有直接由 Lua创建的的对象。因此,如果在Lua中使用构造函数语法分配对象,则该对象归Lua所有。当Lua中不再引用该对象时,Lua GC将收集该对象。
如果Lua通过任何其他方式获得了对对象的引用,则Lua不会拥有该对象,除非您使用Luabind的“采用”政策明确转让了所有权。因此,如果您要绑定(bind)一个将对象返回给Lua的函数,以至于现在希望Lua决定该对象何时处于 Activity 状态,那么您就需要使用采用策略。
最后一段仅适用于实际引用(返回指针和引用类型)。如果给Lua一个对象的拷贝(通过非引用或指针返回值),那么Lua将拥有该对象的拷贝。