需要帮助理解luabind如何实例化类

Need help understanding how luabind instantiates classes

本文关键字:实例化 luabind 帮助 助理      更新时间:2023-10-16

假设我有一个这样的类:

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

并像这样通过Luabind将其暴露给Lua:

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

最后在脚本中实例化它,像这样:

A = Foo();

A在该点的实际"存在状态"是什么?

是否在堆的某个地方,并且lua在某个地方保留对它的引用?(或luabind::object?)

我有一种感觉,它只能是一个指针,比如,由new或等价函数分配。

然而,我可以将函数绑定到接受引用的lua,如lua_doSomething(A & a),最终在那里将是一个实际的引用。当然,我知道这很可能只是将a作为*a传递,但我不知道这是否是如何发生的。

我问这个问题的原因是为了更好地理解和预测脚本中实例化对象的生命周期。

,我不确定是否所有权或生命周期改变了它,而不是像上面那样将类暴露给lua,我这样做:

A * lua_CreateA()
{
return new A();
}
module(luaState) 
    [
        class_<A>("Foo")
    ];

module(luaState)
    [
    def("createA",&lua_CreateA)
    ];

一样使用
A = createA();

根据我目前所理解的逻辑,这种情况需要我进行清理,因为我是分配新对象的人,除非luabind的这种赋值与绑定构造函数的赋值相同。

简而言之,我对对象生命周期和这里的东西真的很困惑……我在谷歌上搜索了与此相关的关键词,但我只得到这样的东西http://www.gamedev.net/topic/525692-luabind-ownership-and-destruction/

这不是我真正想知道的。

对象生命周期在Luabind中非常简单。你不需要了解Luabind内部工作的血腥细节来获得它。

Lua拥有由 Lua直接创建的对象。如果你用Lua中的构造函数语法分配一个对象,那个对象是Lua拥有的。当对象在Lua中不再被引用时,Lua GC将收集它。

如果Lua通过任何其他方式获得对对象的引用,那么Lua不拥有该对象,除非您使用Luabind的adopt策略明确地转移所有权。因此,如果您绑定了一个返回对象给Lua的函数,那么您现在希望Lua决定该对象是活的还是死的,那么您需要使用adopt策略。

最后一段只适用于实际引用(返回指针和引用类型)。如果给Lua一个对象的副本(通过非引用或指针返回值),那么Lua将拥有该对象的副本