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

假设我有一个像这样的类:

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),并且最终在其中得到的是一个实际的引用。 当然,我知道这很可能只是 luabind 将 a 作为 *a 传递,但我不知道它是否是这样实现的。

我之所以问这个问题,是为了更好地了解并预测在脚本中实例化的对象的生命周期。

另外,我不确定如果我不是像上面那样将类暴露到 lua 中,而是像这样做:

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

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

module(luaState)
    [

    def("createA",&lua_CreateA)

    ];

并像这样使用它:

A = createA();

根据我现在了解的情况,这种情况需要我进行清理,因为我是分配新对象的人,除非像使用绑定构造函数一样进行赋值。

简而言之,在对象生命周期和其他方面我确实很困惑... 我搜索了与此相关的关键词,但我只得到了像 http://www.gamedev.net/topic/525692-luabind-ownership-and-destruction/ 这样的东西。

这并不是我想知道的。 我想了解关于分配、实例化、生命周期和所有这些方面的具体处理方式。

原文链接 https://stackoverflow.com/questions/7059426

点赞
stackoverflow用户734069
stackoverflow用户734069

使用 Luabind 对象的生命周期非常简单。你不需要理解 Luabind 内部的详细情况来使用它。

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

如果 Lua 通过其他方式获得一个对象的引用,则除非你使用 Luabind 的 adopt 策略显式地转移所有权,否则 Lua 不拥有该对象。因此,如果你绑定一个返回对象的函数到 Lua,以便让 Lua 决定该对象何时存活或死亡,那么你需要使用 adopt 策略。

最后一段仅适用于实际引用(返回指针和引用类型)。如果 Lua 得到一个对象的 _拷贝_(通过非引用或指针返回值),那么 Lua 将拥有该对象的 _拷贝_。

2011-08-14 20:23:40